与 scalaz.ContT[Trampoline, Unit, ?] 相比,scalaz.concurrent.Future 有什么好处?

What's the benefit of scalaz.concurrent.Future, in comparison to scalaz.ContT[Trampoline, Unit, ?]

我正在寻找用于异步操作的数据类型。

我发现 scalaz.ContT[Trampoline, Unit, ?] 支持 scalaz.concurrent.Future 中的所有功能,此外还支持 BindRec

不过,scalaz.concurrent.Future 的实用程序比 scalaz.ContT[Trampoline, Unit, ?] 多,例如Applicative 实例并行运行 Futures。

我认为这些实用程序也可以为 ContT[Trampoline, Unit, ?] 实现。

为什么作者创建了一个新的基于 Futurescalaz-concurrent 库,而不是重复使用 ContT

冒着开玩笑的风险,一个关键的好处是 Future 是一个很多人都会认识和理解的命名概念,例如 it has its own wikipedia page

我不认识你说的 ContT 类型是等价的。我试图在 scalaz 文档中找到它,但它是 listed there with no explanation。我在哪里可以阅读更多相关信息,您怎么知道它等同于 Future?

你说"an Applicative instance runs Futures in parallel";多个 ContT 操作不会并行 运行 吗?这是 Futures 的一个关键功能,可能会回答您的问题。

更新:

我现在看到 ContT 是延续传递样式的实现,而 scalaz.ContT[Trampoline, Unit, ?] 是延续传递函数的特例,可能与 Future 同构,如果某些外部假设成立。

我认为你的问题的答案与许多其他特殊情况被突出的原因相同,当它们可能被认为是更一般结构的一个情况时:

  • 更容易讨论,更容易命名
  • 效率更高,因为实现可以利用一般结构中可能不存在的一些特殊情况
  • 更容易推理,例如在这里我们可以确定 Futures 是并行执行的,而我们通常不知道关于连续传递函数的情况。 (当然,也可以按顺序执行Futures,就像在一些测试框架中所做的那样,但这不会被认为是Future的常规实现)
  • 这是一个有用的概念,突出显示它并使其易于访问对程序员有好处