[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / interpreter / test / typechecker / t003.hs
1 --!!! Testing monad comprehensions
2 module MonadTest where
3
4 -- Old uses of list comprehensions
5 as :: [Bool]
6 as = [ odd x | x <- [1..10] ]
7
8 -- The next 4 tests used to check that list comprehension syntax
9 -- could be used for monad comprehensions.
10 -- Anticipating Standard Haskell's removal of this feature, we don't
11 -- test (or implement!) that anymore.
12
13 -- Use in monad comprehensions
14 mmap :: (a -> b) -> ([] a -> [] b)
15 mmap f xs = [ f x | x <- xs ]
16
17 -- use ","
18 bind1 :: [] a -> (a -> [] b) -> [] b
19 bind1 m k = [ b | a <- m, b <- k a ]
20
21 bind2 :: [] Int -> (Int -> [] b) -> [] b
22 bind2 m k = [ b | a <- m, odd a, b <- k a ]
23
24 -- use local binding
25 bind3 :: [] a -> (a -> b) -> (b -> [] c) -> [] c
26 bind3 m f k = [ c | a <- m, let b = f a, c <- k b ]
27
28
29 -- The next 4 tests check the use of "do-syntax" for monad comprehensions
30
31 -- Use in monad comprehensions
32 mmap2 :: Monad m => (a -> b) -> (m a -> m b)
33 mmap2 f xs = do { x <- xs; return (f x) }
34
35 -- use ","
36 bind12 :: Monad m => m a -> (a -> m b) -> m b
37 bind12 m k = do { a <- m; b <- k a; return b }
38
39 bind22 :: MonadZero m => m Int -> (Int -> m b) -> m b
40 bind22 m k = do { a <- m; guard (odd a); b <- k a; return b }
41
42 -- use local binding
43 bind32 :: Monad m => m a -> (a -> b) -> (b -> m c) -> m c
44 bind32 m f k = do { a <- m; let { b = f a }; c <- k b; return c }
45
46