2

我知道有些人认为fail这是一个错误,我明白为什么。(似乎 MonadPlus 是用来代替它的)。fail但只要它存在,部分函数使用andpure而不是Justand似乎是有意义的Nothing。因为这将允许您做您当前可以做的所有事情以及更多,所以类似的东西safeHead可以给您传统的Just/Nothing或者您可以返回[x]/ []

从我所读到的内容MonadPlus来看,它似乎比使用fail. 但我对它的了解不够肯定,而且它也可能涉及拉入 Prelude,这可能是一个好主意,但会比仅使用fail.

所以我想我的问题是为什么部分函数不使用failOR MonadPlus,两者似乎都比使用具体类型更好。

4

1 回答 1

8

所以我想我的问题是为什么部分函数不使用failOR MonadPlus,两者似乎都比使用具体类型更好。

好吧,我无法谈论写这些文章的人的动机,但我当然同意他们的偏好。我在这里要说的是,我们中的许多人都遵循一种思想流派,其中具体类型Maybe将是我们的默认选择,因为:

  1. 它简单而具体;
  2. 它完美地模拟了领域;
  3. 它可以通用地映射到您能想到的任何更抽象的解决方案中。

像这样的类型a -> Maybe b完美地模拟了偏函数的概念,因为偏函数要么返回结果(Just b),要么不返回Nothing( ”)。

第 3 点可以用这个函数来说明,它通常转换Maybe aAlternative(它是 的超类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)。各有各的。

于 2016-04-15T00:06:04.637 回答