【发布时间】:2010-09-04 16:52:47
【问题描述】:
我正在尝试在 Haskell 中使用 Maybe 类型。我查找了返回可能的键值元组。如何访问由 Maybe 包装的数据?例如,我想将 Maybe 包含的整数与另一个整数相加。
【问题讨论】:
我正在尝试在 Haskell 中使用 Maybe 类型。我查找了返回可能的键值元组。如何访问由 Maybe 包装的数据?例如,我想将 Maybe 包含的整数与另一个整数相加。
【问题讨论】:
您也可以进行模式匹配:
case maybeValue of
Just value -> ...
Nothing -> ...
【讨论】:
您可以使用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。 (您可以继续以这种方式链接其他计算。)
【讨论】:
f 3 将是 Just 7,而不是 7。
顺便说一句:由于Maybe 是Monad,您可以使用do-notation 构建计算...
sumOfThree :: Maybe Int
sumOfThree = do
a <- someMaybeNumber
b <- someMaybeNumber
c <- someMaybeNumber
let k = 42 -- Just for fun
return (a + b + c + k)
【讨论】:
“也许”的例子:
> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
【讨论】:
对不起,我应该用谷歌搜索一下。
使用 fromMaybe 函数正是我所需要的。 fromMaybe 将返回 Maybe 中的值,如果它不是空的话,否则它将返回一个提供给 fromMaybe 的默认值。
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Maybe.html
【讨论】:
很多人反对使用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
【讨论】: