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

时间:2017-03-31 14:27:21

标签: scala concurrency future scalaz continuations

我一直在寻找异步操作的数据类型。

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

但是,scalaz.concurrent.Future的实用程序比scalaz.ContT[Trampoline, Unit, ?]更多,例如一个Applicative实例并行运行Futures。

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

为什么作者创建了一个新的基于Future的{​​{1}}库,而不是重用scalaz-concurrent

1 个答案:

答案 0 :(得分:2)

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

我不认识你所说的ContT类型是等价的。我试图在scalaz文档中找到它,但它是listed there with no explanation。我在哪里可以阅读更多相关内容,您如何知道它与未来相当?

你说“一个应用实例并行运行期货”;多个ContT操作不能并行运行?这是Futures的一个关键功能,可能是您的问题的答案。

更新

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

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

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