module Main where import Prelude hiding ((+), (*), (^)) data N = Z | S N deriving (Eq, Show) h :: N -> N -> N -> N h Z _ b = S b h (S Z) a Z = a h (S (S Z)) _ Z = Z h _ _ Z = S Z h (S n) (S a) (S b) = h n (S a) (h (S n) (S a) b) (+) :: N -> N -> N (+) = h (S Z) (*) :: N -> N -> N (*) = h (S (S Z)) (^) :: N -> N -> N (^) = h (S (S (S Z))) main = print ((S (S Z)) + (S (S (S Z)))) >> print ((S (S Z)) * (S (S (S Z)))) >> print ((S (S Z)) ^ (S (S (S Z))))