在Maybe中操纵一个值

时间:2015-09-27 03:59:56

标签: haskell functor maybe

我写的一些代码中的函数返回

Just 3

我想要的是删除Just并操纵3。

我必须承认不理解Just语法,但是当我解决这个问题时,我会对此有所帮助。

3 个答案:

答案 0 :(得分:7)

Just 3的类型为Maybe Int。你可以操纵 in {/ 1>} Maybe,最简单的形式是fmap,例如。

ghci> fmap (\x -> x + 1) (Just 3) 
Just 4

保留Maybe类型的结构,也就是说,它会保留Nothing s

ghci> fmap (\x -> x + 1) Nothing
Nothing

或者你可以定义一个模式匹配的函数:

doThing :: Maybe Int -> String
doThing (Just x) = "I got " ++ show x
doThing Nothing  = "I didn't get anything"

ghci> doThing (Just 3)
"I got 3"

还有一个名为fromMaybe的有用函数(在Data.Maybe中定义):

fromMaybe :: a -> Maybe a -> a

它会从Maybe中提取值,但如果结果是Nothing,则必须提供返回的内容:

ghci> import Data.Maybe (fromMaybe)
ghci> fromMaybe 0 (Just 3)
3
ghci> fromMaybe 0 Nothing
0

请注意,在所有这些情况下,如果值为Nothing,我们必须决定该怎么做,这是Maybe类型的基本功能。

答案 1 :(得分:3)

如果我给你一块巧克力蛋糕的食谱,你就可以取出食谱,只要按照你认为合适的方式吃蛋糕。你首先必须遵循食谱。

同样,如果我给你一个Maybe Int,你就不能取消Maybe并操纵Int;您必须先检查它,看看您是否Just Int可以操纵或Nothing

执行此检查的最基本方法是所有其他技术使用的模式匹配。 luqui建议的fromMaybe函数将作为一个很好的例子。如果找到Maybe a,则会使用给定的默认值将a变为Nothing

fromMaybe :: a -> Maybe a -> a
fromMaybe def (Just val) = val
fromMaybe def Nothing = def

专业提示:当你经历学习Haskell的过程时,你会发现几个很好的机会来回顾蛋糕的比喻。

答案 2 :(得分:1)

另一个可能有用的功能,实际上是Prelude,是

maybe :: b -> (a -> b) -> Maybe a -> b

fromMaybe非常相似,但允许您使用函数处理Just内的变量(您需要提供与函数输出类型匹配的默认值)如果你有Nothing)。例如:

maybeShow = maybe "Got nothing..." show

maybeShow $ Just 3  -- gives "3"
maybeShow $ Nothing -- gives "Got nothing..."

然后有一个功能,其他的回答者似乎在策略上避免:)但我认为它应该在这里完整:

import Data.Maybe (fromJust)
fromJust :: Maybe a -> a

从其Just包装器中取出一个值。这个函数的问题是它是一个部分函数,​​即它没有为Nothing值定义:

fromJust $ Just 3  -- gives 3
fromJust $ Nothing -- gives *** Exception: Maybe.fromJust: Nothing

因为你可以看到这个功能有点冒险,它绝对不是一个干净的解决方案。尽管如此,如果你肯定你将无法获得Nothing,或者如果你只是在玩游戏并想要摆脱恼人的Maybe,它可以是在实践中非常有用。