(********* Exercice 1 *********) #include using namespace std; // Booleans struct True { static const bool value = true; }; struct False { static const bool value = false; }; // Naturals struct Zero { static const int value = 0; }; template struct Succ { static const int value = N::value + 1; }; int main(void) { cout << "True = " << True::value << endl; cout << "False = " << False::value << endl; cout << "Zero = " << Zero::value << endl; cout << "Succ(Succ(Zero)) = " << Succ>::value << endl; } template struct Box { typedef T res; }; // access the type via Box<...>::res Box ibox = 1; Box cbox = 'c'; (********* Exercice 2 *********) (==);; (* - : 'a -> 'a -> bool = *) :t (==) -- -> (==) :: Eq a => a -> a -> Bool class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool data Sign = Plus | Minus instance Eq Sign where (==) Plus Plus = True (==) Minus Minus = True (==) Plus Minus = False (==) Minus Plus = False instance Eq a => Eq [a] class Equal a where equal :: a -> a -> Bool instance Equal Int where equal x y = (x == y) instance Equal Char where equal x y = (x == y) instance Equal a => Equal [a] where equal x y = eq_list x y eq_list [] [] = True eq_list (x:xs) (y:ys) = (equal x y) && (eq_list xs ys) eq_list _ _ = False test = equal ['a','b','c'] ['d','e','f']