doc-src/Codegen/Thy/examples/Example.hs
changeset 30226 2f4684e2ea95
parent 29798 6df726203e39
child 31045 f0c7607bb295
equal deleted inserted replaced
30202:2775062fd3a9 30226:2f4684e2ea95
       
     1 {-# OPTIONS_GHC -fglasgow-exts #-}
       
     2 
       
     3 module Example where {
       
     4 
       
     5 
       
     6 foldla :: forall a b. (a -> b -> a) -> a -> [b] -> a;
       
     7 foldla f a [] = a;
       
     8 foldla f a (x : xs) = foldla f (f a x) xs;
       
     9 
       
    10 rev :: forall a. [a] -> [a];
       
    11 rev xs = foldla (\ xsa x -> x : xsa) [] xs;
       
    12 
       
    13 list_case :: forall t a. t -> (a -> [a] -> t) -> [a] -> t;
       
    14 list_case f1 f2 (a : list) = f2 a list;
       
    15 list_case f1 f2 [] = f1;
       
    16 
       
    17 data Queue a = AQueue [a] [a];
       
    18 
       
    19 empty :: forall a. Queue a;
       
    20 empty = AQueue [] [];
       
    21 
       
    22 dequeue :: forall a. Queue a -> (Maybe a, Queue a);
       
    23 dequeue (AQueue [] []) = (Nothing, AQueue [] []);
       
    24 dequeue (AQueue xs (y : ys)) = (Just y, AQueue xs ys);
       
    25 dequeue (AQueue (v : va) []) =
       
    26   let {
       
    27     (y : ys) = rev (v : va);
       
    28   } in (Just y, AQueue [] ys);
       
    29 
       
    30 enqueue :: forall a. a -> Queue a -> Queue a;
       
    31 enqueue x (AQueue xs ys) = AQueue (x : xs) ys;
       
    32 
       
    33 }