Haskell 中的 ApplicativeDo

2024-01-06

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(使用前将#替换为@)

Haskell 中的 ApplicativeDo 的相关文章

  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • Control.Parallel.Strategies 中 Eval 的绑定运算符如何严格评估其参数?

    Control Parallel Strategies 的源代码 http hackage haskell org packages archive parallel 3 1 0 1 doc html src Control Paralle
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • Haskell:对 Num 类型类的使用感到困惑

    我很困惑为什么这有效 f Num a gt a gt a f x x 42 但这并没有 g Num a gt a gt a g x x 4 2 我本来就明白Num包含实现运算符的所有类型 因此 如果42 is an Int and 4 2
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 使用 Haskell 绘制图表

    是否可以使用 Haskell 绘制一个简单的图表 你们中的任何人都可以告诉我该怎么做吗 该图应至少包含 3 个点 Haskell 图表 https github com timbod7 haskell chart似乎不错 The wiki
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu

随机推荐

  • 为什么宇宙飞船运算符里面只有一个等号?

    为何宇宙飞船操作员 lt gt 选择有一个等号而不是两个 这是否被视为与一个等号 通常表示赋值 和两个等号 通常表示比较 不一致 为什么会有两个 里面只有一个 lt gt and 这一点也不矛盾 仅有的 不一致 这是为了避免与赋值运算符发生
  • 如何编写惯用的构造函数

    我对 Go 中的构造函数感到困惑 我见过的大多数构造函数都会返回一个结构体 但 Effective Go 表明在某些情况下可以返回一个接口 根据 普遍性 规则 https golang org doc effective go html g
  • 标志“-D_POSIX_C_SOURCE=200112L”是什么意思?

    没有它 我无法使用连接到互联网所需的库 但我不知道这意味着什么 D POSIX C SOURCE 200112L 谁能解释一下吗 随着时间的推移 POSIX 经历了多次修订 每个新版本都更改了它支持的功能集 该宏定义了您希望使用哪组功能来构
  • 哪里需要(不需要)完整的类型?

    我最近惊讶地发现这段代码可以编译 至少在 gcc 和 MSVC 上 template
  • JavaScript中reduceRight的原生实现是错误的

    对于关联运算f在数组的元素上a 以下关系应该成立 a reduce f 应该等于a reduceRight f 事实上 它确实适用于结合运算和交换运算 为了 例子 const a 0 1 2 3 4 5 6 7 8 9 const add
  • 临时表在 PHPMyAdmin 中不起作用

    我运行这个查询 CREATE TEMPORARY TABLE usercount SELECT FROM users 我收到这条消息 Your SQL query has been executed successfully Query t
  • AttributeError:“Request”对象没有属性“get”

    当我向服务器发出 POST 请求时 我收到 500 错误并带有注释 AttributeError Request object has no attribute get 这是我的服务器 app route api entries metho
  • 将 URL 参数从 Azure ACS 传递到我的自定义身份提供程序?

    我们正在开发一个自定义身份提供商 STS 来验证我们的应用程序 在此项目中 我们使用 Azure 访问控制服务 2 0 我们的身份提供程序是 wsfederation 因此 在启动项目时 azure ACS 有一个名为 wctx 的 url
  • 如何在 Apache 中使用 mod_rewrite 对特殊字符进行编码?

    我希望为我的标记系统提供漂亮的 URL 以及所有特殊字符 and 有没有办法用 mod rewrite 来做到这一点 而不必对链接进行双重编码 我注意到 delicious com 和 stackoverflow 似乎能够处理单编码的特殊字
  • 如何将字典列表转换为数据框?

    这是我要转换为数据框的字典列表 我尝试使用多索引但无法转换整个数据帧 response name xyz empId 007 details address street x street city x city street xx str
  • knockoutjs如何获取选中的选项arrayObject

    我想获取选定的选项对象
  • 如何禁用特定资产的构建警告?

    当我在 Unity IDE 中构建 进入播放模式时 控制台窗口中出现许多警告 这些警告是由第 3 方资源的脚本编译生成的 如何在不更改特定资产的情况下禁用或隐藏这些资产的控制台警告 我预计人们会正义地抱怨我需要如何解决这些警告 而不是把它们
  • 奖励广告回调未触发

    我有一款游戏 当玩家失去生命时 我希望他们能够再次观看视频 我正在使用 unity 版本 2018 1 1f1 人 并且我已经下载了 admob unity 插件版本 3 13 1 因此 如果玩家同意观看广告 广告就会播放 然后继续游戏 而
  • Mongoose:函数“once”

    在 Mongoose 的 入门 中 http mongoosejs com docs index html http mongoosejs com docs index html 有一个使用该函数的示例once db once open f
  • 如何将“from Queue import Queue, Empty”从 Python 2 转换为 Python 3? [复制]

    这个问题在这里已经有答案了 我正在将用 Python 2 编写的源代码转换为 Python 3 我偶然发现了这一点 from Queue import Queue Empty 我把它改为 from multiprocessing impor
  • HibernateJpaVendorAdapter 的generateDdl 不会更改表

    我正在使用 Spring JPA Hibernate 开发一个网站 在持久性配置 JPA Hibernate 中 我将 HibernateJpaVendorAdapter 的generateDdl属性设置为true 实际上新实体在数据库中正
  • Flutter 小部件应该在类中还是在 build() 函数中创建?

    有没有通用的经验法则where创建更优化的小部件 假设小部件不依赖于传递给 build 的任何内容 如果我们在类中创建一个 Widget Foo Key key super key key Widget widget new Contain
  • XSLT 中的命名空间

    我正在学习如何在 XSLT 中执行自定义函数 我发现的每个示例似乎都声明了一个自定义名称空间 例如
  • for-loop 由于变量冲突而无限循环

    有人可以向我解释这如何导致无限循环吗 我从一本 javascript 书的例子中得到了这个 代码如下 function foo function bar a i 3 changing the i in the enclosing scope
  • Haskell 中的 ApplicativeDo

    AFAIK GHC8 的新增内容之一是ApplicativeDo语言扩展 它将 do 符号脱糖为相应的Applicative方法 lt gt lt gt 如果可能的话 我有以下问题 它如何决定是否脱糖Applicative方法可以吗 据我所