summaryrefslogtreecommitdiff
path: root/fp1/week2/mart/TupleOverloading.icl
blob: 2995fbd1370fa18cdfc21d852c6ed80c05f3b9c0 (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
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
         )