Scalaz 中的 Task 和 IO 有什么区别?

What's the difference between Task and IO in Scalaz?

这两种 Scalaz 类型

在概念上看起来非常相似。他们俩:

它们有什么不同?为什么它们都存在?

核心区别在于IO只是延迟了某些事情的执行,而是在当前线程中执行。另一方面,任务能够并发执行某些事情(因此隐含的 ExecutorService)。

此外,Task 带有 scalaz 的 Future 的语义(Future 比经典的 scala 版本更可组合;Future 允许您通过显式定义分叉来更好地控制并发性,而不是尽快并行执行任务实例化)。此外,如果您阅读 scalaz 的 Future 的源代码,它会向您指出 Task 是一个更强大的版本,可以在 prod 中使用。

最后,注意 attemptRun of the Task returns \/[Throwable, A] 而 unsafePerformIO of IO just returns A.这说明对现实生活中的错误场景的处理更为稳健。

据我所知,在任何你会使用 IO 来合成效果的地方,你都会在实际生产代码库中使用 Task。

这是一篇关于任务用法的好博客post:Tim Perrett's Task Post