Haskell unwrap 也许保持多态性

马德罗特

Haskell 初学者又来了。如果我想解开一个Maybe类型并想让它保持抽象,我会使用:

fUnwrap :: Maybe a -> a 
fUnwrap (Just n) = n 
fUnwrap Nothing = ???

不管我用什么Nothing,编译器总是唠叨要更具体地做什么Nothing……你们能帮我吗?

威廉·范·翁塞姆

这是合乎逻辑的。编译器explects类型的值a,但在这里没有价值,你可以提供,因为a可以是任何东西(一BoolInt[Int]Maybe Int,等)。

这与其说是编程问题,不如说是设计问题:如果是Nothing? 这里有一些选项:

  1. 提供一个默认值,那么签名是:

    fUnwrap :: a -> Maybe a -> a 
    fUnwrap _ (Just n) = n
    fUnwrap d Nothing = d
  2. 如果是这样,我们会引发一个错误Nothing(我们可以这样做,既可以省略该行,也可以显式引发错误,尽管在后一种情况下,我们可以指定原因):

    fUnwrap :: Maybe a -> a
    fUnwrap (Just n) = n
    fUnwrap Nothing = error "Nothing has no value"
  3. 我们返回undefined

    fUnwrap :: Maybe a -> a
    fUnwrap (Just n) = n
    fUnwrap Nothing = undefined

    undefined :: a是一个对象,如果它被评估就会引发错误。因此,它是 的一个特例error,但我们“推迟”评估,这样如果值不是必需的,我们就不会得到错误。

但我个人认为第一种方法在这里是可取的,因为函数签名没有指定这些会引发错误,因此导致代码可能会失败,而没有提示它会失败。

AMaybe a通常用作可能“失败”的计算的结果类型:如果成功,则返回Just x(带有x结果),否则返回Nothing

例如,您可以使用do符号来构建Maybe a可能失败的计算链。例如:

foo :: Int -> Maybe Int
foo x = do
    y <- someComputation x
    otherComputation y

以这里为例someComputation, otherComputation :: Int -> Maybe Int

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章