Каква е разликата между Task и IO в Scalaz?

Тези два вида Scalaz

изглеждат много сходни концептуално. Те двамата:

  • Представлява изчисление с потенциален страничен ефект
  • Създайте успешен (A) или неуспешен (Exception) резултат
  • Имате Monad екземпляра
  • Може да се разопакова небезопасно с run или unsafePerformIO

Как се различават? Защо съществуват и двете?


person Chris Martin    schedule 28.08.2015    source източник
comment
Проверете groups.google.com/forum/#!topic/scalaz/mhh_NlkHTFk, включва обяснение от създателя на Task   -  person Chirlo    schedule 28.08.2015
comment
@Chirlo Благодаря - кой от тях е създателят на Task?   -  person Chris Martin    schedule 28.08.2015
comment
Беше Киусано, AFAIK   -  person Chirlo    schedule 28.08.2015


Отговори (1)


Основната разлика е, че IO просто забавя изпълнението на нещо, но го прави в рамките на текуща нишка. Задачата от друга страна е в състояние да изпълни нещо едновременно (по този начин имплицитната ExecutorService).

Освен това Task носи семантиката на Future на scalaz (Future, който е по-съставим от класическата версия на scala; Future, който ви позволява да имате по-висок контрол върху паралелността, като правите разклонението изрично дефинирано и не изпълнявате задачи паралелно веднага щом бъдат създадени). Освен това, ако прочетете източника за Future на scalaz, той ще ви насочи към Task като по-стабилна версия, която може да се използва в prod.

И накрая, имайте предвид, че TryRun на задачата връща \/[Throwable, A], докато unsafePerformIO на IO просто връща A. Това говори за по-стабилно третиране на сценарии за грешки в реалния живот.

Доколкото знам, навсякъде, където бихте използвали IO за композиране на ефекти, бихте използвали Task в реална производствена кодова база.

Ето една добра публикация в блога относно използването на Task: Публикация със задачи на Tim Perrett

person vadimich    schedule 10.09.2015