适用于Haskell

zer*_*one 4 monads haskell applicative

AFAIK GHC8的新增功能之一是ApplicativeDo语言扩展,如果可能的话,它会将相应的Applicative方法(<$>,<*>)取消.我有以下问题.

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

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

Ale*_*lec 10

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

TRAC页是信息的最佳来源.一些要点:

  • ApplicativeDo尽可能使用应用程序 - 包括>>=在某些情况下混合它们,其中只有部分do块是适用的
  • 构造了一种依赖关系的有向图,以查看哪些部分可以"并行化"
  • 有时这个图表没有明显的最佳翻译!在这种情况下,GHC选择(粗略地说)局部最小的翻译

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

这里是一个答案约之间的区别ApplicativeMonad.直接引用:

要进行部署<*>,您可以选择两个计算,一个是函数,另一个是参数,然后它们的值由应用程序组合.要进行部署>>=,您可以选择一个计算,并解释如何使用其结果值来选择下一个计算.它是"批处理模式"和"交互式"操作之间的区别.

这种事情的一个主要例子是Haxlmonad(由Facebook设计),它都是从一些外部源获取数据.使用时Applicative,这些请求可以并行发生,同时Monad强制请求是顺序的.事实上,这个例子是促使Facebook的Simon Marlow首先进行ApplicativeDo扩展并撰写引用文章的原因.

通常,大多数Monad情况不一定受益Applicative.从我上面引用的相同答案:

我很欣赏这ApplicativeDo是一个很好的方法,可以使用更多的应用程序(在某些情况下,这意味着更快)以monadic风格编写的程序,你没有时间重构.但除此之外,我认为应用 - 当你可以 - 但是 - monadic-当你必须也是更好的方式来看看发生了什么.

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