我写的一些代码中的函数返回
Just 3
我想要的是删除Just并操纵3。
我必须承认不理解Just语法,但是当我解决这个问题时,我会对此有所帮助。
答案 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
,它可以是在实践中非常有用。