来自return
的{{1}}和pure
之间的区别是什么?似乎即使在Control.Applicative
块的末尾,我也可以使用pure
?
那么有没有一种情况应该优先于另一种情况(除了每个人都希望在do
阻止结束时return
)?
答案 0 :(得分:35)
在GHC 7.8及之前,Applicative
不是Monad
的超类。甚至可能Monad
实例没有Applicative
实例。但是,期望pure
和return
对于作为两者实例的类型应具有相同的行为。
在GHC 7.10中,由于Functor-Applicative-Monad Proposal,Applicative
现在是Monad
(class 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移出return
类Monad
,并将其作为pure
的别名。
因此,在处理Monad
时,您应该始终能够使用pure
代替return
。但是,您不能采用其他方式,因为pure
的类型比return
更通用,因为它只返回Applicative
。例如以下
wontCheck :: Applicative f => f Int
wontCheck = return 4
由于return
要求f
成为Monad
,不会进行类型检查。