dpsthree
dpsthree

Reputation: 2285

Using Maybe type in Haskell

I'm trying to utilize the Maybe type in Haskell. I have a lookup for key, value tuples that returns a Maybe. How do I access the data that was wrapped by Maybe? For example I want to add the integer contained by Maybe with another integer.

Upvotes: 46

Views: 51625

Answers (6)

arsenm
arsenm

Reputation: 2933

You could use Data.Maybe.fromMaybe, which takes a Maybe a and a value to use if it is Nothing. You could use the unsafe Data.Maybe.fromJust, which will just crash if the value is Nothing. You likely want to keep things in Maybe. If you wanted to add an integer in a Maybe, you could do something like

f x = (+x) <$> Just 4

which is the same as

f x = fmap (+x) (Just 4)

f 3 will then be Just 7. (You can continue to chain additional computations in this manner.)

Upvotes: 25

vikingsteve
vikingsteve

Reputation: 40438

Many people are against the use of fromJust, however it can be convenient if you are aware of what will happen when the lookup fails (error!!)

Firstly you will need this:

import Data.Maybe

And then your lookup from a list of tuples will look like this

Data.Maybe.fromJust $ lookup key listOfTuples

For example, successful lookup:

Data.Maybe.fromJust $ lookup "a" [("a",1),("b",2),("c",3)]
1

And horrible failure looks like this:

Data.Maybe.fromJust $ lookup "z" [("a",1),("b",2),("c",3)]
*** Exception: Maybe.fromJust: Nothing

Upvotes: 4

LennyStackOverflow
LennyStackOverflow

Reputation: 2238

Examples for "maybe":

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54

Upvotes: 8

Dario
Dario

Reputation: 49228

Just as a side note: Since Maybe is a Monad, you can build computations using do-notation ...

sumOfThree :: Maybe Int
sumOfThree = do
  a <- someMaybeNumber
  b <- someMaybeNumber
  c <- someMaybeNumber
  let k = 42 -- Just for fun
  return (a + b + c + k)

Upvotes: 9

Martijn
Martijn

Reputation: 6773

Alternatively you can pattern match:

case maybeValue of
  Just value -> ...
  Nothing    -> ...

Upvotes: 49

dpsthree
dpsthree

Reputation: 2285

Sorry, I should have googled better.

using the fromMaybe function is exactly what I need. fromMaybe will return the value in Maybe if it is not nothing, otherwise it will return a default value supplied to fromMaybe.

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html

Upvotes: 5

Related Questions