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