【问题标题】:Why `Concurrently` is not a monad in Haskell?为什么`Concurrently`不是Haskell中的monad?
【发布时间】:2019-05-08 02:18:23
【问题描述】:

我正在阅读包async 的文档,并试图找到类似于JavaScript 的Promise 的东西,我发现Concurrently,这是实现FunctorApplicative(Promise.全部),Alternative(Promise.race)。但它没有实现Monad (Promise.then),我想知道为什么。

我想这可能是因为(>>=) 是一个顺序操作,与名称Concurrently 冲突,但这是唯一的原因吗?这里还有更重要的原因吗?

【问题讨论】:

  • 是的,这正是原因:monad 的全部意义在于它们对 操作顺序 进行编码,而Concurrently 表示并行性,这本质上是无序的。但Concurrently 实际上并不等同于 JS 承诺。 Promise 不会给你并行性,只有异步性。也许如果您描述了您的最终目标是什么,这里的人可以帮助您找到正确的解决方案。
  • 相关 GitHub 问题:github.com/simonmar/async/pull/26

标签: haskell concurrency promise monads


【解决方案1】:

The Monad typeclass 声明 (<*>)ap 应该是等价的。 (<*>) for Concurrently 同时评估 LHS 和 RHS。 ap 在 LHS 完成之前无法评估 RHS,因为 (>>=) 需要在调用为其提供 RHS 的函数之前完成对 LHS 的评估。

【讨论】:

  • 但是为什么我们不能让ap = (<*>),有什么限制要求(>>=)实现ap吗?
  • 刚才看了代码,发现可能只是个历史问题?
  • ap 不在Monad 类中。对于每个 Monad,它被定义为 ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }。不,这不是历史问题。
  • 所以我想知道,为什么我们不能设计一个monad,其中Applicative 是并发版本,而Monad 是顺序版本?为什么(<*>)ap 必须相等?添加此规则的动机是什么?
  • 我想我明白了。像pure = return(<*>) = ap 这样的法律承诺某些特定数据的ApplicativeMonad 实例具有相同的语义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2012-08-26
  • 1970-01-01
  • 2011-07-01
  • 2021-12-31
  • 2018-01-24
相关资源
最近更新 更多