{ class Num a where (+), (*) :: a -> a -> a negate :: a -> a instance Num Int where (+) = addInt (*) = mulInt negate = negInt instance Num Bool where (+) = addBool (*) = mulBool negate = negBool } numD b u ::= NumDict b b u; triple a b c ::= MkTriple a b c; ;; addInt a b = a + b; mulInt a b = a * b; negInt a = 0 - a; addBool a b = a | b; mulBool a b = a & b; negBool a = not a; add nd = case nd of NumDict a m n -> a end; mul nd = case nd of NumDict a m n -> m end; neg nd = case nd of NumDict a m n -> n end; numDInt = NumDict addInt mulInt negInt; numDBool = NumDict addBool mulBool negBool; { squarePrime numDa x = mul numDa x x; squaresPrime ndt xyz = case ndt of MkTriple nda ndb ndc -> case xyz of MkTriple x y z -> MkTriple (squarePrime nda x) (squarePrime ndb y) (squarePrime ndc z) end end; }