type I a = a; data Term = Con Int | Div Term Term; answer, err :: Term; answer = (Div (Div (Con 1972) (Con 2)) (Con 23)); err = (Div (Con 1)(Con 0)); type M a = a; unit :: a -> I a; unit a = a; (★) :: M a -> (a -> M b) -> M b; a ★ k = k a eval :: Term -> M Int; eval (Con a) = unit a; eval (Div t u) = eval t ★ \a -> eval u ★ \b -> unit (quot a b); main = print (eval answer) -- > 42