В чем разница между 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 в реальной рабочей базе кода.
Вот хорошее сообщение в блоге об использовании Задачи: Пост Задачи Тима Перретта