之间有什么区别return和 pure距离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.
| 归档时间: |
|
| 查看次数: |
3255 次 |
| 最近记录: |