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