Maybe

From HaskellWiki
Maybe class (base)
import Data.Maybe

The Maybe type is defined as follows:

data Maybe a = Nothing | Just a
  deriving (Eq, Ord)

It allows the programmer to specify something may not be there.

Type equation[edit]

Maybe satisfies the type equation Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle F X = 1 + X} , where the functor Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle F} takes a set to a point plus that set.

Comparison to imperative languages[edit]

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.

Classes[edit]

As one can see from the type definition, Maybe will be an instance of Eq and Ord when the base type is. As well, instances of Functor and Monad are defined for Maybe.

For Functor, the fmap function moves inside the Just constructor and is identity on the Nothing constructor.

For Monad, the bind operation passes through Just, while Nothing will force the result to always be Nothing.

Maybe as a Monad[edit]

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

The functions h and h' will give the same results. (Failed to parse (SVG (MathML can be enabled via browser plugin): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle h 0 = h' 0 = h 100 = h' 100 = Nothing;\ h x = h' x = Just\, x} ). In this case the savings in code size is quite modest, stringing together multiple functions like f and g will be more noticeable.

Library functions[edit]

When the module is imported, it supplies a variety of useful functions including:

maybe :: b->(a->b) -> Maybe a -> b
Applies the second argument to the third, when it is Just x, otherwise returns the first argument.
isJust, isNothing
Test the argument, returing a Bool based on the constructor.
listToMaybe, maybeToList
Convert to/from a one element or empty list.
mapMaybe
A different way to filter a list.

See the documentation for Data.Maybe for more explanation and other functions.