-
[clean-tests.git] / old / afp / a3 / genericMap.icl
1 module genericMap
2
3 /*
4 Genric map definition for assignment 3 in AFP 2018
5 Pieter Koopman, pieter@cs.ru.nl
6 September 2018
7
8 Use StdEnv or iTask environment.
9 */
10
11 import StdEnv, StdGeneric
12 import Data.GenEq
13
14 generic gMap a b :: a -> b
15 gMap{|c|} x = x
16 gMap{|UNIT|} x = x
17 gMap{|PAIR|} f g (PAIR x y) = PAIR (f x) (g y)
18 gMap{|EITHER|} f g (LEFT x) = LEFT (f x)
19 gMap{|EITHER|} f g (RIGHT x) = RIGHT (g x)
20 gMap{|CONS|} f (CONS x) = CONS (f x)
21 gMap{|OBJECT|} f (OBJECT x) = OBJECT (f x)
22
23 :: Bin a = Leaf | Bin (Bin a) a (Bin a)
24 t = Bin (Bin Leaf 1 Leaf) 2 (Bin (Bin Leaf 3 Leaf) 4 Leaf)
25 l = [1..7]
26
27 fac 0 = 1
28 fac n = n * fac (dec n)
29
30 derive gMap Bin, [], (,)
31
32 Start =
33 ( gMap{|*->*|} fac t
34 , gMap{|*->*|} (\i->(i, fac i)) l
35 , gMap{|*->*->*|} (gMap{|*->*|} fac) (gMap{|*->*|} fac) (l, t)
36 , gEq{|*|} [1,2] [1,2]
37 , gEq{|*|} [1,2] [2,3]
38 , gEq{|*->*|} (<) [1,2] [2,3]
39 )