summaryrefslogtreecommitdiff
path: root/fp1/week2/camil/TupleOverloading.icl
blob: 0ea437de7c8dcd2d5d31642c2fe46e98455108d1 (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
 * Mart Lubbers, s4109503
 * Camil Staps, s4498062
 */

implementation module TupleOverloading

import StdEnv

instance +    (a,b)   | + a & + b                where
	+ (a,b) (c,d) = (a+c,b+d)
instance +    (a,b,c) | + a & + b & + c          where
	+ (a,b,c) (d,e,f) = (a+d,b+e,c+f)

instance -    (a,b)   | - a & - b                where
	- (a,b) (c,d) = (a-c,b-d)
instance -    (a,b,c) | - a & - b & - c          where
	- (a,b,c) (d,e,f) = (a-d,b-e,c-f)

instance *    (a,b)   | * a & * b                where
	* (a,b) (c,d) = (a*c,b*d)
instance *    (a,b,c) | * a & * b & * c          where
	* (a,b,c) (d,e,f) = (a*d,b*e,c*f)

instance /    (a,b)   | / a & / b                where
	/ (a,b) (c,d) = (a/c,b/d)
instance /    (a,b,c) | / a & / b & / c          where
	/ (a,b,c) (d,e,f) = (a/d,b/e,c/f)

instance zero (a,b)   | zero a & zero b          where
	zero = (zero, zero)
instance zero (a,b,c) | zero a & zero b & zero c where
	zero = (zero, zero, zero)

instance one  (a,b)   | one a & one b            where
	one = (one, one)
instance one  (a,b,c) | one a & one b & one c    where
	one = (one, one, one)

instance ~    (a,b)   | ~ a & ~ b                where
	~ (a,b) = (~ a, ~ b)
instance ~    (a,b,c) | ~ a & ~ b & ~ c          where
	~ (a,b,c) = (~ a, ~ b, ~ c)

Start  = (test (1,2), test (1,2,3))

test a = ( zero + a == a    && a    == a + zero
         , a - zero == a    && a    == ~ (zero - a)
         ,  one * a == a    && a    == a * one
         , zero * a == zero && zero == a * zero
         ,  a / one == a
         ,  ~ (~ a) == a
         )