2015-08-28 44 views
8

這兩種類型的ScalazScalaz中的Task和IO有什麼區別?

看起來很相似的概念。他們都:

  • 代表一種潛在的副作用的計算
  • 生產成功(A)或失敗(Exception)導致
  • Monad實例
  • 不安全地展開與rununsafePerformIO

它們有什麼不同?他們爲什麼都存在?

+3

檢查https://groups.google.com/forum/#!topic/scalaz/mhh_NlkHTFk,包括從Task' – Chirlo

+0

的'創作者的解釋@ Chirlo謝謝 - 他們中的哪一個是Task的創造者? –

+0

這是Chiusano,AFAIK – Chirlo

回答

4

核心區別在於IO只是延遲了某些東西的執行,但在當前線程中執行。另一方面,任務能夠同時執行某些事情(因此隱式ExecutorService)。另外,任務帶有scalaz未來的語義(Future比更經典的Scala版本更具有可比性; Future允許通過使明確定義的分支更明確地執行並行執行,並且在實例化後不會並行執行任務)。此外,如果您閱讀Scalaz的Future的源代碼,它會指示您將Task作爲可用於產品的更強大的版本。

最後,注意,任務的attemptRun返回\/[Throwable的,A]而IO的unsafePerformIO只是返回。這說明了對現實生活錯誤情景的更強有力的處理。

據我所知,在任何地方你會使用IO來編寫效果,你可以在實際生產代碼庫中使用Task。

這裏是一個很好的博客文章有關任務用法:Tim Perrett's Task Post