fundamental algebraic data types: product, union and option