2 % (c) The AQUA Project, Glasgow University, 1994-1996
4 \section[Maybe]{Module @Maybe@}
6 The standard Haskell 1.3 library for working with
10 {-# OPTIONS -fno-implicit-prelude #-}
14 Maybe(..), -- non-standard
15 -- instance of: Eq, Ord, Show, Read,
16 -- Functor, Monad, MonadZero, MonadPlus
18 maybe, -- :: b -> (a -> b) -> Maybe a -> b
20 isJust, -- :: Maybe a -> Bool
21 fromJust, -- :: Maybe a -> a
22 fromMaybe, -- :: a -> Maybe a -> a
23 listToMaybe, -- :: [a] -> Maybe a
24 maybeToList, -- :: Maybe a -> [a]
25 catMaybes, -- :: [Maybe a] -> [a]
26 mapMaybe, -- :: (a -> Maybe b) -> [a] -> [b]
27 unfoldr -- :: (a -> Maybe (b,a)) -> a -> (a,[b])
31 import PrelErr ( error )
32 import Monad ( filter )
39 %*********************************************************
41 \subsection{Functions}
43 %*********************************************************
46 isJust :: Maybe a -> Bool
47 isJust Nothing = False
50 fromJust :: Maybe a -> a
51 fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck
54 fromMaybe :: a -> Maybe a -> a
55 fromMaybe d x = case x of {Nothing -> d;Just v -> v}
57 maybeToList :: Maybe a -> [a]
58 maybeToList Nothing = []
59 maybeToList (Just x) = [x]
61 listToMaybe :: [a] -> Maybe a
62 listToMaybe [] = Nothing
63 listToMaybe (a:_) = Just a
66 findMaybe :: (a -> Bool) -> [a] -> Maybe a
67 findMaybe p = listToMaybe . filter p
70 catMaybes :: [Maybe a] -> [a]
71 catMaybes ls = [x | Just x <- ls]
73 mapMaybe :: (a -> Maybe b) -> [a] -> [b]
76 let rs = mapMaybe f xs in
82 joinMaybe :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
86 Just v1 -> case m2 of {Nothing -> m1; Just v2 -> Just (f v1 v2)}
92 unfoldr f' (foldr f z xs) == (z,xs)
94 if the following holds:
96 f' (f x y) = Just (x,y)
101 unfoldr :: (a -> Maybe (b, a)) -> a -> (a,[b])
104 Just (y,x') -> let (x'',ys) = unfoldr f x' in (x'',y:ys)