41

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

4

6 回答 6

43

或者,您可以进行模式匹配:

case maybeValue of
  Just value -> ...
  Nothing    -> ...
于 2010-09-04T18:09:16.407 回答
25

您可以使用Data.Maybe.fromMaybe,如果它是 ,它需要一个Maybe a和一个值来使用Nothing。您可以使用 unsafe Data.Maybe.fromJust,如果值为Nothing. 您可能希望将内容保存在Maybe. 如果你想在 a 中添加一个整数Maybe,你可以做类似的事情

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

这与

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

f 3然后将Just 7。(您可以继续以这种方式链接其他计算。)

于 2010-09-04T16:58:27.527 回答
9

顺便说一句:既然Maybe是 a 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)
于 2010-09-04T18:21:18.163 回答
8

“也许”的例子:

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
于 2010-09-06T09:25:31.550 回答
4

对不起,我应该更好地用谷歌搜索。

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

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

于 2010-09-04T16:57:07.530 回答
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
于 2013-09-24T10:14:06.590 回答