Scalaz中Task和IO之间有什么区别?

Chr*_*tin 10 io concurrency scala scalaz

这两种Scalaz类型

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

  • 表示潜在的副作用计算
  • 产生success(A)或failure(Exception)结果
  • Monad实例
  • 可以用run或不安全地打开unsafePerformIO

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

vad*_*ich 6

核心区别在于,IO只会延迟某些事情的执行,但会在当前线程中执行.另一方面,任务能够同时执行某些操作(因此是隐式的ExecutorService).

另外,Task包含scalaz的Future(Future比可用的经典scala版本更复杂)的语义; Future允许您通过明确定义分叉来实现更高的并发控制,并且一旦实例化就不能并行执行任务.此外,如果您阅读scalaz的Future的源代码,它将指向您作为一个更强大的版本,可以在prod中使用.

最后,注意任务的attemptRun返回\/[Throwable的,A]而IO的unsafePerformIO只返回一个.这说明了对现实生活中错误情景的更强有力的处理.

据我所知,无论你在哪里使用IO来组合效果,你都会在实际生产代码库中使用Task.

这是一篇关于任务使用的好文章:Tim Perrett的任务帖子