JavaScript 中的生成器函数和 monad 之间有什么联系?

What is the connection between generator functions and monads in JavaScript?

软件开发爱好者noted the following:

Current status: compulsively rewriting all my JS after making the intuitive connection between generator functions and monad comprehensions.

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

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

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

连续的 yield 语句看起来像某种顺序并发 monad 中的嵌套延续,但任何 monad 中的每个后续 'effect' not 都需要 repeated/indeterminate申请。

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

术语monad comprehension 似乎指的是将列表推导实现为monad。参见 Comprehending Monads,(介绍和第 2.2 节)。 然而,在 JS 开发中,'monad comprehension' 似乎与 'monad' 互换使用。

而且我从未听说过 'resumption' 这个词,也找不到 definition/basis 对应的词。

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

有none.

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

真正的 monad 理解可以使用支持它们的编译到 JS 的语言来实现(比如 LatteJs, monadic, PureScript or LispyScript), or sweet.js macros。它们通常会脱糖到回调 - 就像 Haskell.