Haskell 初学者又来了。如果我想解开一个Maybe
类型并想让它保持抽象,我会使用:
fUnwrap :: Maybe a -> a
fUnwrap (Just n) = n
fUnwrap Nothing = ???
不管我用什么Nothing
,编译器总是唠叨要更具体地做什么Nothing
……你们能帮我吗?
这是合乎逻辑的。编译器explects类型的值a
,但在这里没有价值,你可以提供,因为a
可以是任何东西(一Bool
,Int
,[Int]
,Maybe Int
,等)。
这与其说是编程问题,不如说是设计问题:如果是Nothing
? 这里有一些选项:
提供一个默认值,那么签名是:
fUnwrap :: a -> Maybe a -> a
fUnwrap _ (Just n) = n
fUnwrap d Nothing = d
如果是这样,我们会引发一个错误Nothing
(我们可以这样做,既可以省略该行,也可以显式引发错误,尽管在后一种情况下,我们可以指定原因):
fUnwrap :: Maybe a -> a
fUnwrap (Just n) = n
fUnwrap Nothing = error "Nothing has no value"
我们返回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] 删除。
我来说两句