equal
deleted
inserted
replaced
|
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 } |