我有一个输出Maybe Value
类型的函数,但我只想要特定情况下类型Value
的值,我知道它会产生一个值,但是,当我尝试使用它就像value
我得到一个错误:
Couldn't match expected type 'Value' with 'Maybe Value'.
答案 0 :(得分:4)
请勿使用fromJust
等部分功能。在所有情况下,有许多安全选项可以保证您的程序不会崩溃。
假设m :: Maybe Int
我们想要向整数添加一个,或者如果没有整数(1
)则返回m = Nothing
。我们可以使用:
显式模式匹配(最基本的方式)
case m of
Nothing -> 1
Just x -> x+1
maybe
函数(模式匹配的紧凑形式)
maybe 1 (\x -> x+1) m
fromMaybe
函数
-- if m == Nothing, return 0, then add 1
fromMaybe 0 m + 1
如果我们想要返回Just (x+1)
,请保持Nothing
原样:
fmap (+1) m
monadic combinators(通常是矫枉过正,但在某些复杂的情况下很方便)
do x <- m ; return (x+1)
[ x+1 | x <- m ] -- with MonadComprehensions
applicative / alternative combinators
请注意, 某些情况下,部分预测优于安全替代方案。例如,如果将Nothing
映射到没有合理的值,因为Nothing
永远不会发生,崩溃程序可能比返回错误的虚拟值更好。实际上,默默地忽略Nothing
错误,并返回合理的结果可能会在调试过程中引起严重的麻烦。在这种情况下,“早期崩溃”是正确的做法。
用你的智慧评估你是否属于这种情况。即使这样,显式error "foo: internal error -- found Nothing!"
也会提供比通用fromJust: Nothing
错误更好,更具体的运行时错误消息。
答案 1 :(得分:1)
如果您100%确定有值,则可以使用fromJust
进行检索。但是,如果您在Nothing
上调用它,则会出错。