'return'和'pure'之间的区别

gre*_*ole 28 haskell

之间有什么区别returnpure距离Control.Applicative?似乎我pure甚至可以在一个do块结束时使用它?

那么在任何情况下,一个人应该优先于另一个(除了每个人都希望return在一个do区块的末尾)?

Rei*_*chs 38

在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,如hackage的源代码所示.

pure可能是首选,return因为它不会产生Monad约束,只会产生Applicative约束,从而使函数更加通用.由于历史先例,return可能比pure在表示法中更受欢迎,但pure可以用于完全相同的效果.


Lee*_*Lee 17

之后添加了Applicative类型类,Monad并且历史上Monad该类尚未成为其子类Applicative.这最近在这里被改变了Applicative-Monad-Proposal,这意味着它return a应该等同pure a于每个Monad实例.

有一个建议return离开Monad课堂并将其作为别名pure.

因此在处理时Monad你应该始终能够使用pure而不是return.你不能走另一条路,因为它pure有一个更通用的类型,return因为它只返回一个Applicative.例如以下内容

wontCheck :: Applicative f => f Int
wontCheck = return 4
Run Code Online (Sandbox Code Playgroud)

因为return需要f是一个,所以不会打字Monad.