m (→Library Functions: inline formatting)
m (Categorizing as a monad)
Revision as of 15:46, 7 October 2006
The Maybe type is defined as follows:
data Maybe a = Just a | Nothing deriving (Eq, Ord)
It allows the programmer to specify something may not be there.
1 Type Equation
Maybe satisfies the type equation FX = 1 + X, where the functor F takes a set to a point plus that set.
2 Comparison to imperative languages
Imperative languages may support this by rewriting as a union or allow one to use / return NULL (defined in some manner) to specify a value might not be there.
For Monad, the bind operation passes through Just, while Nothing will force the result to always be Nothing.
3.1 Maybe as a Monad
Using the Monad class definition can lead to much more compact code. For example:
f::Int -> Maybe Int f 0 = Nothing f x = Just x g :: Int -> Maybe Int g 100 = Nothing g x = Just x h ::Int -> Maybe Int h x = case f x of Just n -> g n Nothing -> Nothing h' :: Int -> Maybe Int h' x = do n <- f x g n
h' will give the same results. (). In this case the savings in code size is quite modest, stringing together multiple functions like
g will be more noticeable.
4 Library Functions
When the module is imported, it supplies a variety of useful functions including:
- maybe <nowiki>::</nowiki> b->(a->b) -> Maybe a -> b
- Applies the second argument to the third, when it is Just x, otherwise returns the first argument.
- Test the argument, returing a Bool based on the constructor.
- Convert to/from a one element or empty list.
- A different way to filter a list.
See the documentation for Data.Maybe for more explanation and other functions.