AFAIK GHC8 的新增内容之一是ApplicativeDo
语言扩展,它将 do 符号脱糖为相应的Applicative
方法 (<$>
, <*>
) 如果可能的话。我有以下问题。
它如何决定是否脱糖Applicative
方法可以吗?据我所知,它会进行依赖性检查(如果后者取决于前者的结果)来决定资格。还有其他标准吗?
尽管这个添加使得没有任何 Monad 实例的类的应用代码更容易阅读(也许?)。但对于同时具有 Monad 和 Applicative 实例的结构:这是推荐的做法(从可读性角度来看)吗?还有其他好处吗?
它如何决定是否脱糖Applicative
方法可以吗?据我所知,它会进行依赖性检查(如果后者取决于前者的结果)来决定资格。还有其他标准吗?
The paper http://research.microsoft.com/en-us/um/people/simonpj/papers/list-comp/applicativedo.pdf and 跟踪页面 https://ghc.haskell.org/trac/ghc/wiki/ApplicativeDo是最好的信息来源。几点:
-
ApplicativeDo
尽可能使用应用程序 - 包括将它们与>>=
在某些情况下,只有部分do
块是适用的
- 构建一种有向依赖图来查看哪些部分可以“并行化”
- 有时该图没有明显的最佳翻译!在这种情况下,GHC 选择(粗略地说)局部最小的翻译
尽管这个添加使得没有任何类的应用代码更容易阅读Monad
实例(也许?)。但对于两者都有一个结构Monad
and an Applicative
实例:这是推荐的做法吗(从可读性的角度来看)?还有其他好处吗?
这是一个答案 https://stackoverflow.com/a/38719766/3072788关于之间的区别Applicative
and Monad
。直接引用:
部署<*>
,您选择两种计算,一种是函数,另一种是参数,然后通过应用程序组合它们的值。部署>>=
,您选择一个计算,并解释如何利用其结果值来选择下一个计算。这就是“批处理模式”和“交互式”操作的区别。
此类事情的一个典型例子是Haxl https://hackage.haskell.org/package/haxl-0.4.0.1/docs/Haxl-Core.html#t:GenHaxlmonad(由 Facebook 设计),主要作用是从外部源获取数据。使用Applicative
,这些请求可以并行发生Monad
强制请求按顺序进行。事实上,正是这个例子促使 Facebook 的西蒙·马洛 (Simon Marlow) 做出了ApplicativeDo
首先扩展并写下引用的论文。
一般来说,大多数Monad
实例不一定受益于Applicative
。来自我上面引用的同一答案:
我很感激ApplicativeDo
是制作更适用(在某些情况下这意味着更快)的程序的好方法,这些程序是用单子风格编写的,而您没有时间重构。但除此之外,我认为“当你可以时,但当你必须时,应用程序”也是了解正在发生的事情的更好方法。
So: use Applicative
over Monad
在可能的情况下,并利用ApplicativeDo
当它确实比相应的应用表达更好写时(就像在 Facebook 的某些情况下)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)