I have little experience with algebraic data types, because I work in a language without native support. Usually one can use continuation passing style to get a remotely sim