2015-09-25 56 views
16

returnpure from Control.Applicative之间的区别是什么?看起来我可以使用pure,即使在do块的末尾?'return'和'pure'之间的区别

那么是否有任何情况下,一个应该比另一个更受欢迎(除了每个人都期望在do块的末尾有return)?

+6

没有区别,他们都出于历史原因存在('Monad'并非一直Applicative'的'超类)。有一个提议将'return'别名为'pure'。 – Lee

+3

澄清,如果你知道你正在处理'Monad',它们只是相同的。 'pure'比'return'更普遍,因为它返回'Applicative',所以你不能用'pure'替换'return'的所有实例,但是你可以用'return'替换'pure'。 – Lee

+8

@李,我认为这是你的第二句话的另一种方式。 –

回答

26

在GHC 7.8和之前的版本中,Applicative不是Monad的超类。甚至有可能Monad实例没有Applicative实例。然而,有一个期望purereturn应该对两个实例类型具有相同的行为。

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

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

12

Applicative typeclass在Monad之后添加,历史上Monad类不是Applicative的子类。这是在最近Applicative-Monad-Proposal相当改变,这意味着return a应相当于pure a为每Monad实例。

有一个proposalreturn移出Monad类,并使其成为pure的别名。

因此,在处理Monad时,应始终能够使用pure而不是return。你不能走另一条路然而,由于pure具有更普遍的类型比return,因为它只返回Applicative。例如,下面的

wontCheck :: Applicative f => f Int 
wontCheck = return 4 

不会键入检查,因为return要求f是一个Monad

+0

即使对方的回答被接受和更早版本,我真的很喜欢你的榜样 –

相关问题