return
和pure
与Control.Applicative
有什么区别?似乎即使在pure
块的末尾也可以使用do
吗?
那么,在任何情况下都应该优先考虑另一个(除了每个人都希望在return
块的末尾有一个do
)吗?
最佳答案
在GHC 7.8及更高版本中,Applicative
不是Monad
的父类(super class)。 Monad
实例甚至可能没有Applicative
实例。但是,人们期望pure
和return
对于作为两者实例的类型应该具有相同的行为。
在GHC 7.10中,由于存在Functor-Applicative-Monad Proposal,Applicative
现在是Monad
(class Applicative m => Monad m
)的父类(super class),并且现在的规则是,所有pure
实例的return
和Monad
必须相同。实际上,return
的默认实现现在是pure
,如the source on hackage所示。pure
可能比return
更受青睐,因为它不会产生Monad
约束,而不会产生Applicative
约束,因此使函数更通用。由于历史的先例,在注释符号中return
可能比pure
更可取,但是pure
可以用于完全相同的效果。
关于haskell - 'return'和 'pure'之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32788082/