X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FMaybe.hs;h=0e8bef572ea0f17cf4317719fd49f472d6b2c3b1;hb=4b26136ab82fb1ff12e49477c4833a9586d368c5;hp=4b7b67e305445c9c4f3201fd7282d78a393b5ce0;hpb=f7a485978f04e84b086f1974b88887cc72d832d0;p=haskell-directory.git diff --git a/Data/Maybe.hs b/Data/Maybe.hs index 4b7b67e..0e8bef5 100644 --- a/Data/Maybe.hs +++ b/Data/Maybe.hs @@ -1,4 +1,4 @@ -{-# OPTIONS -fno-implicit-prelude #-} +{-# OPTIONS_GHC -fno-implicit-prelude #-} ----------------------------------------------------------------------------- -- | -- Module : Data.Maybe @@ -6,7 +6,7 @@ -- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org --- Stability : experimental +-- Stability : stable -- Portability : portable -- -- The Maybe type, and associated operations. @@ -35,10 +35,37 @@ import {-# SOURCE #-} GHC.Err ( error ) import GHC.Base #endif +#ifdef __NHC__ +import Prelude +import Prelude (Maybe(..), maybe) +import Maybe + ( isJust + , isNothing + , fromJust + , fromMaybe + , listToMaybe + , maybeToList + , catMaybes + , mapMaybe + ) +#else + +#ifndef __HUGS__ -- --------------------------------------------------------------------------- -- The Maybe type, and instances -data Maybe a = Nothing | Just a deriving (Eq, Ord) +-- | The 'Maybe' type encapsulates an optional value. A value of type +-- @'Maybe' a@ either contains a value of type @a@ (represented as @'Just' a@), +-- or it is empty (represented as 'Nothing'). Using 'Maybe' is a good way to +-- deal with errors or exceptional cases without resorting to drastic +-- measures such as 'error'. +-- +-- The 'Maybe' type is also a monad. It is a simple kind of error +-- monad, where all errors are represented by 'Nothing'. A richer +-- error monad can be built using the 'Data.Either.Either' type. + +data Maybe a = Nothing | Just a + deriving (Eq, Ord) instance Functor Maybe where fmap _ Nothing = Nothing @@ -57,36 +84,60 @@ instance Monad Maybe where -- --------------------------------------------------------------------------- -- Functions over Maybe +-- | The 'maybe' function takes a default value, a function, and a 'Maybe' +-- value. If the 'Maybe' value is 'Nothing', the function returns the +-- default value. Otherwise, it applies the function to the value inside +-- the 'Just' and returns the result. maybe :: b -> (a -> b) -> Maybe a -> b maybe n _ Nothing = n maybe _ f (Just x) = f x +#endif /* __HUGS__ */ +-- | The 'isJust' function returns 'True' iff its argument is of the +-- form @Just _@. isJust :: Maybe a -> Bool isJust Nothing = False isJust _ = True +-- | The 'isNothing' function returns 'True' iff its argument is 'Nothing'. isNothing :: Maybe a -> Bool isNothing Nothing = True isNothing _ = False +-- | The 'fromJust' function extracts the element out of a 'Just' and +-- throws an error if its argument is 'Nothing'. fromJust :: Maybe a -> a fromJust Nothing = error "Maybe.fromJust: Nothing" -- yuck fromJust (Just x) = x +-- | The 'fromMaybe' function takes a default value and and 'Maybe' +-- value. If the 'Maybe' is 'Nothing', it returns the default values; +-- otherwise, it returns the value contained in the 'Maybe'. fromMaybe :: a -> Maybe a -> a fromMaybe d x = case x of {Nothing -> d;Just v -> v} +-- | The 'maybeToList' function returns an empty list when given +-- 'Nothing' or a singleton list when not given 'Nothing'. maybeToList :: Maybe a -> [a] maybeToList Nothing = [] maybeToList (Just x) = [x] +-- | The 'listToMaybe' function returns 'Nothing' on an empty list +-- or @'Just' a@ where @a@ is the first element of the list. listToMaybe :: [a] -> Maybe a listToMaybe [] = Nothing listToMaybe (a:_) = Just a - + +-- | The 'catMaybes' function takes a list of 'Maybe's and returns +-- a list of all the 'Just' values. catMaybes :: [Maybe a] -> [a] catMaybes ls = [x | Just x <- ls] +-- | The 'mapMaybe' function is a version of 'map' which can throw +-- out elements. In particular, the functional argument returns +-- something of type @'Maybe' b@. If this is 'Nothing', no element +-- is added on to the result list. If it just @'Just' b@, then @b@ is +-- included in the result list. mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe _ [] = [] mapMaybe f (x:xs) = @@ -95,3 +146,4 @@ mapMaybe f (x:xs) = Nothing -> rs Just r -> r:rs +#endif /* else not __NHC__ */