Понимание библиотек Scala FP - программирование

Понимание библиотек Scala FP

Просто для наглядности для того, кто хочет начать работать с библиотекой Scala FP, чтобы стать лучше в чистой FP.

Кто-нибудь прояснит разницу/отношение между Cats и Cats-Effect, Cats-Effects IO? Кроме того, где Zio и Monix стоят по отношению к этому? Наконец, какое отношение это имеет к ScalaZ 7/8?

Итак, на основании того, что я прочитал, хорошая комбинация библиотеки для работы на основе доступной документации и того, что они делают, - это Cats, затем Cats-Effect и ZIO, которые можно использовать с Cats-эффектами? Но я не совсем понимаю, почему и хотел бы найти хороший путь, чтобы научиться быть лучшим программистом FP, оставаясь при этом продуктивным, и мне не нужно заканчивать "Программирование FP в Scala", прежде чем я начну делать выбор.

4b9b3361

Ответ 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-эффект.