summaryrefslogtreecommitdiff
path: root/assignment-3/genericMap.icl
blob: f2d99e2d988d82195df81849fd911af7b2977954 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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