所以我想我的问题是为什么部分函数不使用fail
OR MonadPlus
,两者似乎都比使用具体类型更好。
好吧,我无法谈论写这些文章的人的动机,但我当然同意他们的偏好。我在这里要说的是,我们中的许多人都遵循一种思想流派,其中具体类型Maybe
将是我们的默认选择,因为:
- 它简单而具体;
- 它完美地模拟了领域;
- 它可以通用地映射到您能想到的任何更抽象的解决方案中。
像这样的类型a -> Maybe b
完美地模拟了偏函数的概念,因为偏函数要么返回结果(Just b
),要么不返回Nothing
( ”)。
第 3 点可以用这个函数来说明,它通常转换Maybe a
为Alternative
(它是 的超类MonadPlus
)的任何实例:
import Control.Applicative
fromMaybe :: Alternative f => Maybe a -> f a
fromMaybe Nothing = empty
fromMaybe (Just a) = pure a
因此,按照这种理念,您可以根据 来编写部分函数Maybe
,如果您需要将结果放在其他Alternative
实例中,那么您可以使用fromMaybe
函数作为适配器。
然而,这可以反过来争论,你会有这个:
safeHead :: Alternative f => [a] -> f a
safeHead [] = empty
safeHead (a:_) = pure a
safeHead xs
...与打字只是短于的论点fromMaybe (safeHead xs)
。各有各的。