-- The three statements below beginning "type" may be omitted -- but the code is then more fragile. data Term = Con Int | Div Term Term; type M a = (a, Count); type Count = Int; answer, err :: Term; answer = (Div (Div (Con 1972) (Con 2)) (Con 23)); err = (Div (Con 1)(Con 0)); eval :: Term -> M Int; eval (Con a) = (a, 0); eval (Div t u) = let {(a, ca) = eval t; (b, cb) = eval u} in (div a b, 1+ca+cb); main = print (eval answer) -- > (42,2)