Algebraic datatype definitions