' return'之间的区别和纯粹的'

时间:2015-09-25 18:02:02

标签: haskell

来自return的{​​{1}}和pure之间的区别是什么?似乎即使在Control.Applicative块的末尾,我也可以使用pure

那么有没有一种情况应该优先于另一种情况(除了每个人都希望在do阻止结束时return)?

2 个答案:

答案 0 :(得分:35)

在GHC 7.8及之前,Applicative不是Monad的超类。甚至可能Monad实例没有Applicative实例。但是,期望purereturn对于作为两者实例的类型应具有相同的行为。

在GHC 7.10中,由于Functor-Applicative-Monad ProposalApplicative现在是Monadclass Applicative m => Monad m)的超类,现在它是pure的规则并且所有return个实例的Monad必须相同。实际上,return的默认实现现在是pure,如the source on hackage中所示。

pure可能优先于return,因为它不会产生Monad约束,只会产生Applicative约束,从而使函数更通用。由于历史先例,return可能优先于pure,但pure可用于完全相同的效果。

答案 1 :(得分:16)

Monad之后添加了Applicative类型类,历史上Monad类不是Applicative的子类。最近在Applicative-Monad-Proposal中对此进行了更改,这意味着每个return a实例pure a应相当于Monad

有一个proposal移出returnMonad,并将其作为pure的别名。

因此,在处理Monad时,您应该始终能够使用pure代替return。但是,您不能采用其他方式,因为pure的类型比return更通用,因为它只返回Applicative。例如以下

wontCheck :: Applicative f => f Int
wontCheck = return 4
由于return要求f成为Monad

不会进行类型检查。