Algebraic types