为什么安全的部分函数使用Maybe而不是泛化到任何Monad

sem*_*lon 2 monads haskell

我知道有些人认为fail是个错误,我明白为什么.(似乎MonadPlus是为了取代它).但只要它存在,似乎使用部分函数failpure不是JustNothing.因为这将允许你做你现在可以做的所有事情和更多,所以像safeHead你可以给你传统的Just/ Nothing或者你可以返回[x]/ [].

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

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

Lui*_*las 8

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

好吧,我不能说出那些写作者的动机,但我当然赞同他们的偏好.我在这里要说的是,我们中的许多人都遵循一种思想流派,具体类型就像Maybe我们的默认选择,因为:

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

类似于a -> Maybe b完美地模拟部分函数的概念,因为部分函数要么返回result(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
Run Code Online (Sandbox Code Playgroud)

因此,按照这种理念,您可以根据Maybe需要编写部分函数,如果您需要将结果放在其他Alternative实例中,那么您可以使用fromMaybe函数作为适配器.

然而,这可以反过来说,你有这个:

safeHead :: Alternative f => [a] -> f a
safeHead [] = empty
safeHead (a:_) = pure a
Run Code Online (Sandbox Code Playgroud)

...关于打字只是safeHead xs短于的论点fromMaybe (safeHead xs).给每个人自己.

  • @semicolon我认为第2点是"对每个人自己"的答案.如果你选择`safeHead :: Alternative f => [a] - > fa`(或你的`MonadPlus`约束或其他什么),你就不会得到'safeHead xs :: [a]`最多只有一个元素的承诺*来自类型签名*,而`safeHead :: [a] - >也许a`确实给了你这个承诺.换句话说,更通用的类型还允许更具体的类型没有的错误实现.你可能会说很难以错误的方式编写这么小的功能; 但是编写防止错误的类型的习惯是一个很好的习惯. (3认同)

归档时间:

查看次数:

240 次

最近记录:

9 年,4 月 前