X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FMaybe.hs;h=2f98c70e6eee655405db49719c330f2db790eb25;hb=HEAD;hp=3f1ffad76562cb7ab74e796fff2fc264e8539f43;hpb=d9e5fa673b75cdffbcd0e85cdcc98d706acbb29a;p=ghc-base.git diff --git a/Data/Maybe.hs b/Data/Maybe.hs index 3f1ffad..2f98c70 100644 --- a/Data/Maybe.hs +++ b/Data/Maybe.hs @@ -1,16 +1,15 @@ -{-# OPTIONS -fno-implicit-prelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude, DeriveGeneric #-} + ----------------------------------------------------------------------------- --- +-- | -- Module : Data.Maybe -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org --- Stability : experimental +-- Stability : stable -- Portability : portable -- --- $Id: Maybe.hs,v 1.3 2001/07/03 14:13:32 simonmar Exp $ --- -- The Maybe type, and associated operations. -- ----------------------------------------------------------------------------- @@ -18,29 +17,56 @@ module Data.Maybe ( Maybe(Nothing,Just)-- instance of: Eq, Ord, Show, Read, - -- Functor, Monad, MonadPlus + -- Functor, Monad, MonadPlus - , maybe -- :: b -> (a -> b) -> Maybe a -> b + , maybe -- :: b -> (a -> b) -> Maybe a -> b - , isJust -- :: Maybe a -> Bool - , isNothing -- :: Maybe a -> Bool - , fromJust -- :: Maybe a -> a - , fromMaybe -- :: a -> Maybe a -> a + , isJust -- :: Maybe a -> Bool + , isNothing -- :: Maybe a -> Bool + , fromJust -- :: Maybe a -> a + , fromMaybe -- :: a -> Maybe a -> a , listToMaybe -- :: [a] -> Maybe a - , maybeToList -- :: Maybe a -> [a] - , catMaybes -- :: [Maybe a] -> [a] - , mapMaybe -- :: (a -> Maybe b) -> [a] -> [b] + , maybeToList -- :: Maybe a -> [a] + , catMaybes -- :: [Maybe a] -> [a] + , mapMaybe -- :: (a -> Maybe b) -> [a] -> [b] ) where #ifdef __GLASGOW_HASKELL__ -import {-# SOURCE #-} GHC.Err ( error ) import GHC.Base +import GHC.Generics (Generic) #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, Generic) instance Functor Maybe where fmap _ Nothing = Nothing @@ -54,41 +80,65 @@ instance Monad Maybe where Nothing >> _ = Nothing return = Just - fail _ = Nothing + fail _ = Nothing -- --------------------------------------------------------------------------- -- 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) = @@ -97,3 +147,4 @@ mapMaybe f (x:xs) = Nothing -> rs Just r -> r:rs +#endif /* else not __NHC__ */