在Haskell中使用Maybe类型

dps*_*ree 34 haskell maybe

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

Mar*_*ijn 36

或者你可以模式匹配:

case maybeValue of
  Just value -> ...
  Nothing    -> ...
Run Code Online (Sandbox Code Playgroud)

  • 我应该在类型声明中说什么? (2认同)

ars*_*enm 19

您可以使用Data.Maybe.fromMaybe,Maybe a如果是,则使用a 和值Nothing.您可以使用不安全的Data.Maybe.fromJust,如果值为,则会崩溃Nothing.你可能想把东西放进去Maybe.如果你想在a中添加一个整数Maybe,你可以做类似的事情

f x = (+x) <$> Just 4
Run Code Online (Sandbox Code Playgroud)

这是一样的

f x = fmap (+x) (Just 4)
Run Code Online (Sandbox Code Playgroud)

f 3那将是Just 7.(您可以继续以这种方式链接其他计算.)


Dar*_*rio 8

正如旁注:既然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)
Run Code Online (Sandbox Code Playgroud)


Len*_*low 8

"可能"的示例:

> maybe 0 (+ 42) Nothing
0
> maybe 0 (+ 42) (Just 12)
54
Run Code Online (Sandbox Code Playgroud)


dps*_*ree 5

抱歉,我应该更好地用谷歌搜索。

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

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

  • 是的,但是请确保这是您想要的行为,因为例如,如果您要使用 Maybe Int,然后每次它为 Nothing 时,您都返回零,那么您应该直接使用一个普通的旧 Int 。开始。也许应该帮助编码结果或值的缺失,而不是真正应该解决。就我个人而言,我尝试避开 fromMaybe 函数。 (7认同)