doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs
changeset 24628 33137422d7fd
parent 23956 48494ccfabaf
child 24991 c6f5cc939c29
equal deleted inserted replaced
24627:cc6768509ed3 24628:33137422d7fd
     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 }