doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs
author haftmann
Wed, 14 Feb 2007 10:06:13 +0100
changeset 22317 b550d2c6ca90
child 22813 882513df2472
permissions -rw-r--r--
continued class tutorial
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
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     3
import Nat;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     4
import Integer;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     5
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     6
class Semigroup a where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     7
  mult :: a -> a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     8
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
     9
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    10
class (Semigroup a) => Monoidl a where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    11
  neutral :: a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    12
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    13
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    14
class (Monoidl a) => Group a where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    15
  inverse :: a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    16
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    17
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    18
inverse_int :: Integer -> Integer;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    19
inverse_int i = negate i;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    20
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    21
neutral_int :: Integer;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    22
neutral_int = 0;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    23
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    24
mult_int :: Integer -> Integer -> Integer;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    25
mult_int i j = i + j;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    26
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    27
instance Semigroup Integer where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    28
  mult = mult_int;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    29
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    30
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    31
instance Monoidl Integer where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    32
  neutral = neutral_int;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    33
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    34
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    35
instance Group Integer where {
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    36
  inverse = inverse_int;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    37
};
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    38
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    39
pow_nat :: (Monoidl a) => Nat -> a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    40
pow_nat (Suc n) x = mult x (pow_nat n x);
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    41
pow_nat Zero_nat x = neutral;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    42
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    43
pow_int :: (Group a) => Integer -> a -> a;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    44
pow_int k x =
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    45
  (if 0 <= k then pow_nat (nat k) x
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    46
    else inverse (pow_nat (nat (negate k)) x));
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    47
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    48
example :: Integer;
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    49
example = pow_int 10 (-2);
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    50
b550d2c6ca90 continued class tutorial
haftmann
parents:
diff changeset
    51
}