module FunDep3 where
data Zero = Zero deriving (Show)
newtype Succ n = Succ n deriving (Show)
one = Succ Zero
two = Succ one
class Add a b c | a b -> c where add :: a -> b -> c
instance Add Zero b b where add _ b = b
instance Add a b c => Add (Succ a) b (Succ c) where
add (Succ a) b = Succ (add a b)
double n = add n n
three = add one two
four = double two
eight = double four
class Mul a b c | a b -> c where mul :: a -> b -> c
instance Mul Zero b Zero where mul _ _ = Zero
instance (Mul a b c1,Add b c1 c) => Mul (Succ a) b c where
mul (Succ a) b = add b (mul a b)
nine = mul three three
n36 = mul four nine