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