Diese zwei Scalaz-Typen
scheinen sehr ähnlich zu sein. Sie beide:
A
) oder ein Fehler ( Exception
) Ergebnis Monad
Instanzen run
oder unsafePerformIO
unsicher ausgepackt werden
Wie unterscheiden sie sich? Warum gibt es sie beide?
Der Hauptunterschied besteht darin, dass IO die Ausführung von etwas verzögert, aber innerhalb eines aktuellen Threads. Aufgabe dagegen kann etwas gleichzeitig ausführen (also den impliziten ExecutorService).
Darüber hinaus trägt Task die Semantik von scalaz 'Future (Zukunft, die kompakter ist als die klassische scala-Version; Future, die eine höhere Kontrolle der Parallelität ermöglicht, indem forking explizit definiert wird und Tasks nicht parallel ausgeführt werden, sobald sie instanziiert werden) . Wenn Sie die Quelle für scalaz's Future lesen, wird Sie auf Task als eine robustere Version verweisen, die in prod verwendet werden kann.
Beachten Sie schließlich, dass "triplyRun" der Aufgabe \ / [Throwable, A] zurückgibt, während unsafePerformIO von IO nur A zurückgibt. Dies spricht für eine robustere Behandlung von Fehlerszenarien im realen Leben.
Soweit ich weiß, würden Sie überall, wo Sie IO zum Erstellen von Effekten verwenden würden, Task in der realen Codebasis verwenden.
Hier ist ein guter Blogpost über die Verwendung von Aufgaben: Tim Perretts Aufgabenbeitrag
Tags und Links scala concurrency io scalaz