功能可能输出

时间:2016-04-21 09:59:15

标签: haskell

我有一个输出Maybe Value类型的函数,但我只想要特定情况下类型Value的值,我知道它会产生一个值,但是,当我尝试使用它就像value我得到一个错误:

Couldn't match expected type 'Value' with 'Maybe Value'.

2 个答案:

答案 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上调用它,则会出错。