Haskell/Libraries/Maybe
The Maybe data is used with functions that might be unsuccessful. The full description is in Maybe monad chapter.
Definition
[edit | edit source]The Standard Prelude defines the Maybe type as follows:
data Maybe a = Nothing | Just a Recall that the type a is polymorphic and can contain complex types or even other monads (such as IO () types).
Library functions
[edit | edit source]The module Data.Maybe, in the standard hierarchical libraries, contains a wealth of functions for working with Maybe values.
Querying
[edit | edit source]Two obvious functions give you information about a Maybe value:
isJust
[edit | edit source]isJust returns True if when given an argument in the form Just _.
isJust :: Maybe a -> Bool isJust (Just _) = True isJust Nothing = False isNothing
[edit | edit source]isNothing returns True if its argument is Nothing.
isNothing :: Maybe a -> Bool isNothing (Just _) = False isNothing Nothing = True Getting out
[edit | edit source]There are a handful of functions for converting Maybe values to non-Maybe values.
maybe
[edit | edit source]maybe applies a given function to the internal value passed by a Just but otherwise returns a default value when given Nothing.
maybe :: b -> (a -> b) -> Maybe a -> b maybe _ f (Just x) = f x maybe z _ Nothing = z fromMaybe
[edit | edit source]We might want to use maybe without applying any function to the Just. We can do that by calling maybe with the function id. Data.Maybe already has this as fromMaybe:
fromMaybe :: a -> Maybe a -> a fromMaybe z = maybe z id Note the use of point-free style. maybe z id evaluates to a function that is ready to take a Maybe value.
Lists and Maybe
[edit | edit source]The many similarities between lists and Maybe are discussed in the List monad chapter. Given the connections, there are a couple of functions for converting between one and the other:
listToMaybe
[edit | edit source]Failed computations return [] for lists and Nothing for Maybe. listToMaybe converts from the list to the Maybe monad. As Maybe can only hold one value, listToMaybe only takes the first solution from a list.
listToMaybe :: [a] -> Maybe a listToMaybe [] = Nothing listToMaybe (x:_) = Just x maybeToList
[edit | edit source]The reverse listToMaybe is, of course, maybeToList:
maybeToList :: Maybe a -> [a] maybeToList Nothing = [] maybeToList (Just x) = [x] Lists manipulation
[edit | edit source]There are a couple of functions which are analogues of the normal Prelude list manipulation functions but are specialized to Maybe values.
Continue on some failures
[edit | edit source]We might want an OR function that won't make a whole computation fail just because one part failed.
catMaybes
[edit | edit source]Given a list of Maybe values, catMaybes extracts all the values in the form Just _, and strips off the Just constructors. List comprehension does the job here (as we showed in the pattern matching chapter):
catMaybes :: [Maybe a] -> [a] catMaybes ms = [ x | Just x <- ms ] mapMaybe
[edit | edit source]mapMaybe applies a function to a list and collects the successes. It can be understood as a composition of functions you already know:
mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe f xs = catMaybes (map f xs) However, the actual definition in Data.Maybe traverses the list is potentially more efficient:
mapMaybe :: (a -> Maybe b) -> [a] -> [b] mapMaybe _ [] = [] mapMaybe f (x:xs) = case f x of Just y -> y : mapMaybe f xs Nothing -> mapMaybe f xs Stop on failure
[edit | edit source]Rather than OR, we might want to collect values if and only if all succeed.
sequence
[edit | edit source]sequence :: [Maybe a] -> Maybe [a] sequence [] = Just [] sequence (Nothing:xs) = Nothing sequence (Just x:xs) = case sequence xs of Just xs' -> Just (x:xs') _ -> Nothing