В чем разница между Task и IO в Scalaz?

Эти два типа Скалаз

  • scalaz.concurrent.Task[+A]
  • scalaz.effect.IO[A]

кажутся очень концептуально похожими. Они оба:

  • Представлять потенциально побочные вычисления
  • Произведите успех (A) или неудача (Exception) результат
  • Есть Monad экземпляры
  • Может быть небезопасно распакован с run или же unsafePerformIO

Чем они отличаются? Почему они оба существуют?

1 ответ

Решение

Основное отличие состоит в том, что IO просто задерживает выполнение чего-либо, но делает это в текущем потоке. Задача, с другой стороны, способна выполнять что-то одновременно (таким образом, неявный ExecutorService).

Кроме того, Task содержит семантику скалярного Future (Future, который более выполним, чем классическая версия Scala; Future, который позволяет вам иметь больший контроль над параллелизмом, делая разветвление явно определенных и не выполняя задачи параллельно, как только создается экземпляр). Более того, если вы прочитаете исходник скалаза Future, он укажет вам на Task как на более надежную версию, которую можно использовать в prod.

Наконец, обратите внимание, что try-Run of Task возвращает \/[Throwable, A], тогда как unsafePerformIO из IO просто возвращает A. Это говорит о более надежной обработке сценариев ошибок в реальной жизни.

Насколько я знаю, везде, где вы бы использовали IO для создания эффектов, вы использовали бы Task в реальной рабочей базе кода.

Вот хорошее сообщение в блоге об использовании Задачи: Пост Задачи Тима Перретта

Другие вопросы по тегам