所以我想我的问题是为什么部分函数不使用failOR 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)。各有各的。