Scalaz начался как попытка перенести на Scala некоторые хорошо зарекомендовавшие себя абстракции из Haskell (например, классы типов для Monad, Functor и многие другие). Проблема заключалась в том, что у него нет хорошей документации, поэтому в основном вам нужно было использовать документацию библиотек Haskell, чтобы понять, как использовать определенные ресурсы Scalaz. В настоящее время есть книга Сэма Халлидея Функциональное программирование для смертных, которую вы можете использовать в качестве учебного пособия для Scalaz.
Кошки были созданы позже, по сути, как повторная реализация того, что предоставил Scalaz. Cats содержит гораздо лучшую документацию, чем Scalaz, есть также отличная книга Scala with Cats.
Scalaz и Cats могут иметь очень похожие цели, поэтому они конкурируют как универсальная библиотека FP для Scala. Существуют также библиотеки, которые служат уровнем совместимости между обеими библиотеками.
Cats-Effect - это библиотека, которая предоставляет стандартную монаду ввода-вывода для Scala (идея снова заимствована из Haskell (?)). Это зависит от кода из основной библиотеки Cats.
Дополнительную информацию можно найти здесь зачем нужна монада IO для Scala, когда есть стандартная библиотека Future.
Monix - еще одна библиотека, которая предоставляет монаду ввода-вывода для Scala, но на этот раз она называется Task
. Это должно было быть более абстракцией высокого уровня и упростить взаимодействие с кодом с помощью стандартной библиотеки Future. На самом деле он имеет много общего с Cats-Effect и создателем Monix Александру Недельку также является одним из основных участников Cats-Effect.
Здесь вы можете найти дополнительную информацию о различиях между cats.effect.IO
и monix.eval.Task
, а также некоторую историю обоих.
Наконец, есть ZIO, который начался как попытка переопределить монаду ввода-вывода для Scalaz, но в итоге превратился в совершенно отдельную библиотеку (так что не зависит от кодовой базы Scalaz).
Самое замечательное во всех библиотеках то, что все они реализуют классы типов (например, Sync или Concurrent) из Cats-Effect, поэтому использование шаблона называется окончательный вариант без тегов, вы можете переключаться между реализациями.
Эта иерархия классов типов также служит библиотекой интерполяции между многими (всеми (?)) Реализациями ввода-вывода (поскольку к моменту ее создания уже было fs2.Task
, monix.Task
& scalaz.IO
). Кроме того, очевидно, что в будущем IO часть может быть перемещена в другой модуль, оставив только возможности взаимодействия классы типов.
Если вы не используете tagless final, вы все равно можете использовать модули, которые обеспечивают взаимодействие между определенными монадами IO, например zio-interop-cats ( между ZIO и Cats-Effect или catnap для Monix - Cats-Effect.
Для вашего сведения, я недавно расширил этот ответ до полноценного сообщение в блоге.
person
Community
schedule
03.07.2019