data Nat = Z | S Nat
 deriving ( Eq, Show)
    
double :: Nat -> Nat
double x = case x of
    Z    -> Z
    S x' -> S ( S (double x' ) )

isEven :: Nat -> Bool
isEven x = case x of
    Z    -> True
    S x' -> not ( isEven x' )

x1 = S ( S ( S Z))

------------------------------------

pfold :: b -> (b -> b) -> Nat -> b
pfold z s x = case x of
    Z    -> z
    S x' -> s ( pfold z s x' )

double' :: Nat -> Nat
double' = pfold Z ( S . S)

isEven' :: Nat -> Bool
isEven' = pfold True not
