我知道有些人认为fail
是个错误,我明白为什么.(似乎MonadPlus是为了取代它).但只要它存在,似乎使用部分函数fail
而pure
不是Just
和Nothing
.因为这将允许你做你现在可以做的所有事情和更多,所以像safeHead
你可以给你传统的Just
/ Nothing
或者你可以返回[x]
/ []
.
从我所读到的内容MonadPlus
看起来似乎比使用更好fail
.但是我对此肯定不够了解,而且它也可能涉及拉入Prelude,这可能是一个好主意,但这将是一个比使用更大的变化fail
.
所以我想我的问题是为什么部分函数不使用fail
OR MonadPlus
,两者似乎都比使用具体类型更好.
所以我想我的问题是为什么部分函数不使用
fail
ORMonadPlus
,两者似乎都比使用具体类型更好.
好吧,我不能说出那些写作者的动机,但我当然赞同他们的偏好.我在这里要说的是,我们中的许多人都遵循一种思想流派,具体类型就像Maybe
我们的默认选择,因为:
类似于a -> Maybe b
完美地模拟部分函数的概念,因为部分函数要么返回result(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
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)
.给每个人自己.
归档时间: |
|
查看次数: |
240 次 |
最近记录: |