module genericMap import StdEnv import StdGeneric import GenEq generic gMap a b :: a -> b gMap{|Int|} x = x gMap{|Real|} x = x gMap{|UNIT|} x = x gMap{|PAIR|} f g (PAIR x y) = PAIR (f x) (g y) gMap{|EITHER|} f g (LEFT x) = LEFT (f x) gMap{|EITHER|} f g (RIGHT x) = RIGHT (g x) gMap{|CONS|} f (CONS x) = CONS (f x) gMap{|OBJECT|} f (OBJECT x) = OBJECT (f x) :: Bin a = Leaf | Bin (Bin a) a (Bin a) derive gMap [], (,), Bin t = Bin (Bin Leaf 1 Leaf) 2 (Bin (Bin Leaf 3 Leaf) 4 Leaf) l = [1..7] // Part 1 Start = gMap{|*->*|} fac t // (Bin (Bin Leaf 1 Leaf) 2 (Bin (Bin Leaf 3 Leaf) 5 Leaf)) Start = gMap{|*->*|} (\i -> (i, fac i)) l // [(1,1),(2,2),(3,3),(4,5),(5,8),(6,13),(7,21)] Start = gMap{|*->*->*|} (gMap{|*->*|} fac) (gMap{|*->*|} fac) (l,t) // ([1,2,3,5,8,13,21],(Bin (Bin Leaf 1 Leaf) 2 (Bin (Bin Leaf 3 Leaf) 5 Leaf))) // Part 2 Start = gEq{|*|} [1,2] [1,2] // True Start = gEq{|*|} [1,2] [2,3] // False Start = gEq{|*->*|} (\a b -> not (a < b || b < a)) [1,2] [2,3] // False fac n = let fs = [1:1:[(fs!!(i-1)) + (fs!!(i-2)) \\ i <- [2..]]] in fs !! n