doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs
author haftmann
Tue, 18 Sep 2007 10:44:02 +0200
changeset 24628 33137422d7fd
parent 23956 48494ccfabaf
child 24991 c6f5cc939c29
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     1
module Classes where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     2
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
     3
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
     4
data Nat = Suc Classes.Nat | Zero_nat;
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
     5
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
     6
data Bit = B1 | B0;
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
     7
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
     8
nat_aux :: Integer -> Classes.Nat -> Classes.Nat;
33137422d7fd updated
haftmann
parents: 23956
diff changeset
     9
nat_aux i n =
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    10
  (if i <= 0 then n else Classes.nat_aux (i - 1) (Classes.Suc n));
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    11
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    12
nat :: Integer -> Classes.Nat;
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    13
nat i = Classes.nat_aux i Classes.Zero_nat;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    14
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    15
class Semigroup a where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    16
  mult :: a -> a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    17
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    18
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    19
class (Classes.Semigroup a) => Monoidl a where {
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    20
  neutral :: a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    21
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    22
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    23
class (Classes.Monoidl a) => Group a where {
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    24
  inverse :: a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    25
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    26
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    27
inverse_int :: Integer -> Integer;
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    28
inverse_int i = negate i;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    29
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    30
neutral_int :: Integer;
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    31
neutral_int = 0;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    32
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    33
mult_int :: Integer -> Integer -> Integer;
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    34
mult_int i j = i + j;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    35
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    36
instance Classes.Semigroup Integer where {
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    37
  mult = Classes.mult_int;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    38
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    39
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    40
instance Classes.Monoidl Integer where {
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    41
  neutral = Classes.neutral_int;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    42
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    43
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    44
instance Classes.Group Integer where {
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    45
  inverse = Classes.inverse_int;
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    46
};
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    47
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    48
pow_nat :: (Classes.Group b) => Classes.Nat -> b -> b;
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    49
pow_nat (Classes.Suc n) x = Classes.mult x (Classes.pow_nat n x);
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    50
pow_nat Classes.Zero_nat x = Classes.neutral;
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    51
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    52
pow_int :: (Classes.Group a) => Integer -> a -> a;
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    53
pow_int k x =
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    54
  (if 0 <= k then Classes.pow_nat (Classes.nat k) x
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    55
    else Classes.inverse (Classes.pow_nat (Classes.nat (negate k)) x));
23956
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    56
48494ccfabaf updated
haftmann
parents: 22813
diff changeset
    57
example :: Integer;
24628
33137422d7fd updated
haftmann
parents: 23956
diff changeset
    58
example = Classes.pow_int 10 (-2);
22317
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    59
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    60
}