Was ist der Unterschied zwischen Task und IO in Scalaz?

8

Diese zwei Scalaz-Typen

scheinen sehr ähnlich zu sein. Sie beide:

  • Stellen Sie eine potenziell nebensächliche Berechnung dar
  • Erzeugt ein Erfolgsergebnis ( A ) oder ein Fehler ( Exception ) Ergebnis
  • Habe Monad Instanzen
  • Kann mit run oder unsafePerformIO unsicher ausgepackt werden

Wie unterscheiden sie sich? Warum gibt es sie beide?

    
Chris Martin 28.08.2015, 08:26
quelle

1 Antwort

4

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

    
vadimich 10.09.2015, 00:28
quelle

Tags und Links