data Val a = Val a | Fkt a | Inc a | Abs a | Neg a instance Num (Val a) where negate (Val a) = Fkt a negate (Fkt a) = Inc a negate (Inc a) = Abs a negate (Abs a) = Neg a negate (Neg a) = Val a eval (Val a) = a eval (Fkt a) = fkt a where fkt a = if a > 0 then a * fkt (a-1) else 1 eval (Inc a) = a + 1 eval (Abs a) = abs a eval (Neg a) = - a v = Val 4 main = mapM_ (print . eval) [v, -v, -(-v), -(-(-v)), -(-(-(-v))), -(-(-(-(-v))))]