Functions in Data.Maybe
2013-12-12
Most introductions to monads in Haskell talk about Maybe
. Here are
some of the handy functions in that module for operating on the type.
maybe
(the first function below) is should be available in ghci
right away in Prelude, but the others require that you load the
Data.Maybe module in ghci:
λ> :m +Data.Maybe
maybe
either applies a function to a Maybe
or returns a default
value. It's type signature looks like this:
maybe :: b -> (a -> b) -> Maybe a -> b
λ> let x = Just 40
λ> let y = Nothing
λ> maybe 30 (*2) x -- x is Just 40, so it gets applied to (*2)
80
λ> maybe 30 (*2) y -- y is Nothing, we end up with the default value
30
isJust
is straightforward. Given a Maybe
argument, it returns true if it's Just
:
isJust :: Maybe a -> Bool
λ> isJust x
True
λ> isJust y
False
isNothing
: not hard to figure what this does:
isNothing :: Maybe a -> Bool
λ> isNothing x
False
λ> isNothing y
True
fromJust
is a relatively unsafe way to get at the value of a Maybe
:
fromJust :: Maybe a -> a
λ> fromJust x
40
λ> fromJust y
*** Exception: Maybe.fromJust: Nothing -- woops. use a case expression in real code
fromMaybe
is similar to maybe
, but instead of a function argument
being applied to the value, you simply get the value in your Maybe
or the default you pass in:
fromMaybe :: a -> Maybe a -> a
λ> fromMaybe 30 x
40
λ> fromMaybe 30 y
30
maybeToList
will plop your Maybe
's value into a list and return it:
maybeToList :: Maybe a -> [a]
λ> maybeToList x
[40]
λ> maybeToList y
[] -- always get a value, it just happens to be an empty list if we pass in Nothing
listToMaybe
goes the other way:
listToMaybe :: [a] -> Maybe a
λ> listToMaybe [2]
Just 2
λ> listToMaybe $ maybeToList x
Just 40
λ> listToMaybe $ maybeToList y
Nothing
λ> listToMaybe [20,40,60] -- listToMaybe will drop all but the first element
Just 20
λ> listToMaybe "foo"
Just 'f'
catMaybes
takes a list of Maybe
s and returns a list of the values
for any Just
value, but drops out your Nothing
s:
catMaybes :: [Maybe a] -> [a]
λ> catMaybes [x, y, (Just 21), Nothing, Just(22)]
[40,21,22]
mapMaybe
lets you apply a function that accepts and returns a
Maybe
to a list of Maybe
s, but returns a list of the values (and
skips the Nothing
s):
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
λ> let f x = (+2) <$> x -- or fmap (+2) x
λ> f (Just 30)
Just 32
λ> mapMaybe f [(Just 20), Nothing, x]
[22,42]