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