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

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

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

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

1 ответ

Решение

Scalaz начался как попытка перенести в Scala некоторые хорошо зарекомендовавшие себя абстракции от Haskell (например, классы типов для Monad, Functor и многое другое). Проблема была в том, что у него нет отличной документации, поэтому в основном вам нужно было использовать документацию библиотек Haskell, чтобы понять, как использовать определенные ресурсы 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, вы можете переключаться между реализациями.

Эта иерархия классов типов также служит библиотекой интерполяции между многими (всеми (?)) Реализациями ввода-вывода (так как к моменту создания они уже были fs2.Task, monix.Task & scalaz.IO). Также, по-видимому, в будущем часть ввода-вывода может быть перемещена в другой модуль, оставляя только классы типов взаимодействия.

Если вы не используете finalless без тегов, вы все равно можете использовать модули, которые обеспечивают взаимодействие между определенными монадами ввода-вывода, например, zio-interop-cats (между ZIO и Cats-Effect, или catnap для Monix - Cats-Effect.

Другие вопросы по тегам