2010-09-04 38 views
31

我正在尝试在Haskell中使用Maybe类型。我查找了返回Maybe的关键值数组。如何访问由Maybe包装的数据?例如,我想将Maybe包含的整数与另一个整数相加。在Haskell中使用Maybe类型

+1

这是一个重复:http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that -contains-just/3375712#3375712 – 2010-09-04 19:16:49

回答

31

另外,您可以模式匹配:用do -notation由于MaybeMonad,你可以建立计算:

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

这更像我想要做的,而不是我找到的答案。谢谢 – dpsthree 2010-09-07 05:22:59

+1

我应该在类型声明中说什么? – qed 2014-12-24 21:03:54

3

对不起,我应该GOOGLE更好。

使用fromMaybe函数正是我所需要的。 fromMaybe将返回Maybe中的值,如果它不是什么也不返回,否则它将返回提供给fromMaybe的默认值。

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

+6

是的,但要确保这是你想要的行为,因为如果你打算,例如,使用一个Maybe Int,然后每当它没有时你返回零,那么你应该有从一开始就使用了一个普通的旧Int。也许是应该帮助编码没有结果或价值,而不是真的应该被解决。我个人尽量避开fromMaybe函数。 – 2010-09-11 03:44:25

18

你可以使用Data.Maybe.fromMaybe,这需要一个Maybe a和值,如果它是Nothing使用。您可以使用不安全的Data.Maybe.fromJust,如果值为Nothing,则会发生崩溃。你可能想保留在Maybe。如果你想在一个Maybe添加一个整数,你可以不喜欢

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

这是一样的

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

f 3然后将Just 7。 (您可以继续链附加的计算以这种方式)。

+0

'f 3'将会是'只有7',而不是'7'。 – Yitz 2010-09-04 23:55:28

+0

据此编辑。 – jrockway 2010-09-05 00:07:37

8

正如一个侧面说明...

为 “可能”
sumOfThree :: Maybe Int 
sumOfThree = do 
    a <- someMaybeNumber 
    b <- someMaybeNumber 
    c <- someMaybeNumber 
    let k = 42 -- Just for fun 
    return (a + b + c + k) 
4

很多人都反对使用fromJust,但是如果你知道的,当查找失败会发生什么它可以方便的(错误!)

首先,你需要这样的:

import Data.Maybe 

然后从元组列表您查找看起来像这样

Data.Maybe.fromJust $ lookup key listOfTuples 

例如,成功的查询:

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

而且可怕的失败看起来是这样的:

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