与 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, ?]
实现。
为什么作者创建了一个新的基于 Future
的 scalaz-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
同构,如果某些外部假设成立。
我认为你的问题的答案与许多其他特殊情况被突出的原因相同,当它们可能被认为是更一般结构的一个情况时:
- 更容易讨论,更容易命名
- 效率更高,因为实现可以利用一般结构中可能不存在的一些特殊情况
- 更容易推理,例如在这里我们可以确定
Future
s 是并行执行的,而我们通常不知道关于连续传递函数的情况。 (当然,也可以按顺序执行Futures,就像在一些测试框架中所做的那样,但这不会被认为是Future的常规实现) - 这是一个有用的概念,突出显示它并使其易于访问对程序员有好处