【问题标题】:What is the connection between generator functions and monads in JavaScript?JavaScript 中的生成器函数和 monad 之间有什么联系?
【发布时间】:2015-08-23 09:10:39
【问题描述】:

软件开发爱好者noted the following

当前状态:在生成器函数和 monad 理解之间建立直观联系后,强制重写我所有的 JS。

我觉得我在那里错过了什么。我对回调地狱的解决方案是使用js-csp 之类的东西(即队列)。

我的问题是:生成器函数和 JavaScript 中的 monad 之间有什么联系?

【问题讨论】:

  • 好吧,作者一定也漏掉了什么。生成器函数不是单子理解。
  • 您对原始推文的后续 cmets 有何看法?
  • @mrmcgreg:除了作者在那篇文章中根本没有使用生成器。他似乎将它们与迭代器混淆了。
  • 作者在哪里说“使用生成器函数构建单子解析器组合器?当然,没问题。”然后链接到:github.com/bodil/graham/blob/master/parse.js#L10

标签: javascript generator monads


【解决方案1】:

没有。

虽然生成器函数可能看起来非常类似于 monad 推导式(即do 表示法),但它们并不通用。主要问题是 ES6 生成器是有状态的,并且每次延续只能推进一次。尝试与他们一起实现 list monad 并看到它失败。

可以使用支持它们的 compile-to-JS 语言(如 LatteJsmonadicPureScriptLispyScript)或 sweet.js macros 来实现真正的 monad 理解。它们通常对回调进行去糖 - 就像在 Haskell 中一样。

【讨论】:

  • 您对原始推文的后续 cmets 有何看法?
  • @hawkeye:你具体针对哪些?
  • 原作者所说的“使用生成器函数构建一元解析器组合器?当然,没问题。”然后链接到:github.com/bodil/graham/blob/master/parse.js#L10
  • 不知道他在这里是什么意思,也找不到实际使用run 的示例。看起来run 从指定解析器序列的生成器创建了一个解析器,但它无法进行回溯。他的Parser<A> 类型(这是一个函数)确实是一元的,有retseq
【解决方案2】:

不,感知到的直觉本质是脆弱的。

连续的 yield 语句看起来像某种顺序并发 monad 中的嵌套延续,但任何 monad 中的每个后续“效果”需要重复/不确定的应用程序。

您可以使用生成器来实现 monad 的实例,但我认为这就是关系的范围(即不一定是直观的); monad 似乎更通用。

monad comprehension 一词似乎是指将列表理解实现为 monad。请参阅Comprehending Monads,(简介和第 2.2 节)。 然而,在 JS 开发中,“monad comprehension”通常与“monad”互换使用。

而且我从未听说过“恢复”这个词,也找不到它的定义/依据。

我现在无法访问 twitter,但也许你的朋友正在尝试创建一个惰性 lodash/underscore/list-homomorphism 库?

【讨论】:

  • 您对原始推文的后续 cmets 有何看法?
  • 即使这可能有点挑剔,有两个澄清:由于生成器只是迭代器工厂,可迭代对象是可观察对象的对偶。此外,生成器不会保持延续而是恢复,因为前者应该始终处于尾部位置。
  • 这个答案是错误的 - 这是一个使用生成器函数实现 Do-Notation/Monad Comprehension 的库:github.com/pelotom/burrido ~ 另外:虽然 monad 和理解可能不是等价的概念,但它们密切相关;例如,monad 的 map 和 flatMap 部分都可以使用 monad 理解来恢复。
  • 另外,Burrido 模仿单子风格,在虚拟机中使用延续而不是封闭的 lambda(一种去糖的 do-notation)。鉴于 OP 的问题,我认为谨慎地说 burrido 强制人们采用 VM 约定而不是依赖于使用函数/组合构造的通用组合器(绑定/返回),并且 在每个“步骤”中总是需要一个应用程序“()”。事实上,burrido 将用户实现的“绑定”与它通过自己的延续提供的隐式绑定混淆了!
猜你喜欢
  • 2011-05-31
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多