module generic_eq import StdEnv, StdGeneric generic gEq a :: a a -> Bool gEq{|Int|} x y = x == y gEq{|Bool|} x y = x == y gEq{|Real|} x y = x == y gEq{|Char|} x y = x == y gEq{|UNIT|} x y = True gEq{|OBJECT|} f (OBJECT x) (OBJECT y) = f x y gEq{|CONS|} f (CONS x) (CONS y) = f x y gEq{|RECORD|} f (RECORD x) (RECORD y) = f x y gEq{|FIELD|} f (FIELD x) (FIELD y) = f x y gEq{|PAIR|} fl fr (PAIR lx rx) (PAIR ly ry) = fl lx ly && fr rx ry gEq{|EITHER|} fl _ (LEFT x) (LEFT y) = fl x y gEq{|EITHER|} _ fr (RIGHT x) (RIGHT y) = fr x y gEq{|EITHER|} _ _ _ _ = False :: T = C1 Int ([Char], ?Bool) | C2 derive gEq [], T, (,), ? Start = (gEq{|*|} C2 (C1 42 ([], ?Just True)), gEq{|*->*|} (<) [1,2,3] [2,3,4]) // (False, True)