它是如何决定是否可以解除Applicative
方法?据我所知,它会进行依赖性检查(如果后者取决于前者的结果)来决定资格。还有其他标准吗?
该paper和trac page是最好的信息来源。一些要点:
ApplicativeDo
使用applicatives尽可能 - 包括在某些情况下,其中仅do
块的一部分是应用性
- A排序依赖性的有向图的构成为看到
>>=
将它们混合,其部分可以是“并行化”
- 有时候这个图没有明显的最佳翻译!在这种情况下,GHC选择是(粗略地讲)翻译本地最小
虽然这除了使应用性的代码更易于读取,没有任何Monad
实例类(也许?)。但对于结构都有Monad
和Applicative
实例:这是推荐的做法(从可读性的角度来看)?还有其他好处吗?
Here is an answer约Applicative
和Monad
之间的差异。要直接引用:
要部署<*>
,你选择两次计算,函数的一个,其他的说法,那么它们的值是由应用程序相结合。要部署>>=
,您需要选择一种计算方法,然后解释如何使用其结果值来选择下一个计算。这是“批处理模式”和“交互式”操作之间的区别。
这样的事情的一个典型的例子是Haxl
单子(被Facebook设计),其是关于从某些外部源读取数据。使用Applicative
,这些请求可以并行发生,而Monad
强制请求是顺序的。事实上,这个例子是促使Facebook的Simon Marlow在第一时间做出ApplicativeDo
扩展的原因,并写出引用的文章。
一般而言,大多数Monad
实例未必受益于Applicative
。从相同的答案我上面引述:
我明白,ApplicativeDo
是让更多的应用性的好方法(在某些情况下,这意味着更快)计划写在单子的风格,你有没有时间重构。但除此之外,我认为当你一时可以应用时,应用也是更好的方式来看看发生了什么。
所以:使用Applicative
超过Monad
在可能的情况,并利用ApplicativeDo
当它真正是更好的写(喜欢它一定是在某些情况下,Facebook的)比相应的应用性表达。