doc-src/IsarAdvanced/Classes/Thy/code_examples/Classes.hs
changeset 23956 48494ccfabaf
parent 22813 882513df2472
child 24628 33137422d7fd
equal deleted inserted replaced
23955:f1ba12c117ec 23956:48494ccfabaf
     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 }