return
和pure
from Control.Applicative
之间的区别是什么?看起来我可以使用pure
,即使在do
块的末尾?'return'和'pure'之间的区别
那么是否有任何情况下,一个应该比另一个更受欢迎(除了每个人都期望在do
块的末尾有return
)?
return
和pure
from Control.Applicative
之间的区别是什么?看起来我可以使用pure
,即使在do
块的末尾?'return'和'pure'之间的区别
那么是否有任何情况下,一个应该比另一个更受欢迎(除了每个人都期望在do
块的末尾有return
)?
在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
,因为它不会产生约束条件,只会约束Applicative
,从而使函数更一般化。 return
可能会优先于pure
,因为历史先例,但pure
可以用于完全相同的效果。
Applicative typeclass在Monad
之后添加,历史上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
。
即使对方的回答被接受和更早版本,我真的很喜欢你的榜样 –
没有区别,他们都出于历史原因存在('Monad'并非一直Applicative'的'超类)。有一个提议将'return'别名为'pure'。 – Lee
澄清,如果你知道你正在处理'Monad',它们只是相同的。 'pure'比'return'更普遍,因为它返回'Applicative',所以你不能用'pure'替换'return'的所有实例,但是你可以用'return'替换'pure'。 – Lee
@李,我认为这是你的第二句话的另一种方式。 –