1 module Classes where { |
1 module Classes where { |
2 |
2 |
3 |
3 |
4 data Nat = Zero_nat | Suc Nat; |
4 data Nat = Suc Classes.Nat | Zero_nat; |
5 |
5 |
6 data Bit = B0 | B1; |
6 data Bit = B1 | B0; |
7 |
7 |
8 nat_aux :: Integer -> Nat -> Nat; |
8 nat_aux :: Integer -> Classes.Nat -> Classes.Nat; |
9 nat_aux i n = (if i <= 0 then n else nat_aux (i - 1) (Suc n)); |
9 nat_aux i n = |
|
10 (if i <= 0 then n else Classes.nat_aux (i - 1) (Classes.Suc n)); |
10 |
11 |
11 nat :: Integer -> Nat; |
12 nat :: Integer -> Classes.Nat; |
12 nat i = nat_aux i Zero_nat; |
13 nat i = Classes.nat_aux i Classes.Zero_nat; |
13 |
14 |
14 class Semigroup a where { |
15 class Semigroup a where { |
15 mult :: a -> a -> a; |
16 mult :: a -> a -> a; |
16 }; |
17 }; |
17 |
18 |
18 class (Semigroup a) => Monoidl a where { |
19 class (Classes.Semigroup a) => Monoidl a where { |
19 neutral :: a; |
20 neutral :: a; |
20 }; |
21 }; |
21 |
22 |
22 class (Monoidl a) => Group a where { |
23 class (Classes.Monoidl a) => Group a where { |
23 inverse :: a -> a; |
24 inverse :: a -> a; |
24 }; |
25 }; |
25 |
26 |
26 inverse_int :: Integer -> Integer; |
27 inverse_int :: Integer -> Integer; |
27 inverse_int i = negate i; |
28 inverse_int i = negate i; |
30 neutral_int = 0; |
31 neutral_int = 0; |
31 |
32 |
32 mult_int :: Integer -> Integer -> Integer; |
33 mult_int :: Integer -> Integer -> Integer; |
33 mult_int i j = i + j; |
34 mult_int i j = i + j; |
34 |
35 |
35 instance Semigroup Integer where { |
36 instance Classes.Semigroup Integer where { |
36 mult = mult_int; |
37 mult = Classes.mult_int; |
37 }; |
38 }; |
38 |
39 |
39 instance Monoidl Integer where { |
40 instance Classes.Monoidl Integer where { |
40 neutral = neutral_int; |
41 neutral = Classes.neutral_int; |
41 }; |
42 }; |
42 |
43 |
43 instance Group Integer where { |
44 instance Classes.Group Integer where { |
44 inverse = inverse_int; |
45 inverse = Classes.inverse_int; |
45 }; |
46 }; |
46 |
47 |
47 pow_nat :: (Group b) => Nat -> b -> b; |
48 pow_nat :: (Classes.Group b) => Classes.Nat -> b -> b; |
48 pow_nat (Suc n) x = mult x (pow_nat n x); |
49 pow_nat (Classes.Suc n) x = Classes.mult x (Classes.pow_nat n x); |
49 pow_nat Zero_nat x = neutral; |
50 pow_nat Classes.Zero_nat x = Classes.neutral; |
50 |
51 |
51 pow_int :: (Group a) => Integer -> a -> a; |
52 pow_int :: (Classes.Group a) => Integer -> a -> a; |
52 pow_int k x = |
53 pow_int k x = |
53 (if 0 <= k then pow_nat (nat k) x |
54 (if 0 <= k then Classes.pow_nat (Classes.nat k) x |
54 else inverse (pow_nat (nat (negate k)) x)); |
55 else Classes.inverse (Classes.pow_nat (Classes.nat (negate k)) x)); |
55 |
56 |
56 example :: Integer; |
57 example :: Integer; |
57 example = pow_int 10 (-2); |
58 example = Classes.pow_int 10 (-2); |
58 |
59 |
59 } |
60 } |