2016-11-19 46 views
3

AFAIK新增加的GHC8之一是ApplicativeDo语言的扩展,这desugars的DO-符号到相应Applicative方法(<$><*>)如果可能的话。我有以下问题。ApplicativeDo在Haskell

它是如何决定是否可以解除Applicative方法?据我所知,它会进行依赖性检查(如果后者取决于前者的结果)来决定资格。还有其他标准吗?

虽然这种添加使得应用代码更易于阅读没有任何Monad实例(可能?)的类。但是对于既有Monad又有Applicative实例的结构:这是一个推荐实践(从可读性的角度来看)?还有其他好处吗?

回答

8

它是如何决定是否可以解除Applicative方法?据我所知,它会进行依赖性检查(如果后者取决于前者的结果)来决定资格。还有其他标准吗?

papertrac page是最好的信息来源。一些要点:

  • ApplicativeDo使用applicatives尽可能 - 包括在某些情况下,其中仅do块的一部分是应用性
  • A排序依赖性的有向图的构成为看到>>=将它们混合,其部分可以是“并行化”
  • 有时候这个图没有明显的最佳翻译!在这种情况下,GHC选择是(粗略地讲)翻译本地最小

虽然这除了使应用性的代码更易于读取,没有任何Monad实例类(也许?)。但对于结构都有MonadApplicative实例:这是推荐的做法(从可读性的角度来看)?还有其他好处吗?

Here is an answerApplicativeMonad之间的差异。要直接引用:

要部署<*>,你选择两次计算,函数的一个,其他的说法,那么它们的值是由应用程序相结合。要部署>>=,您需要选择一种计算方法,然后解释如何使用其结果值来选择下一个计算。这是“批处理模式”和“交互式”操作之间的区别。

这样的事情的一个典型的例子是Haxl单子(被Facebook设计),其是关于从某些外部源读取数据。使用Applicative,这些请求可以并行发生,而Monad强制请求是顺序的。事实上,这个例子是促使Facebook的Simon Marlow在第一时间做出ApplicativeDo扩展的原因,并写出引用的文章。

一般而言,大多数Monad实例未必受益于Applicative。从相同的答案我上面引述:

我明白,ApplicativeDo是让更多的应用性的好方法(在某些情况下,这意味着更快)计划写在单子的风格,你有没有时间重构。但除此之外,我认为当你一时可以应用时,应用也是更好的方式来看看发生了什么。

所以:使用Applicative超过Monad在可能的情况,并利用ApplicativeDo当它真正是更好的写(喜欢它一定是在某些情况下,Facebook的)比相应的应用性表达。