data E = Zero | One | T | Plus E E | Times E E deriving Show e :: E e = let b = Plus T One in Times b b d :: E -> E d e = case e of Zero -> Zero ; One -> Zero ; T -> One Plus x y -> Plus (d x) (d y) Times x y -> Plus (Times y (d x)) (Times x (d y))