Понимание библиотек Scala FP - PullRequest
10 голосов
/ 03 июля 2019

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

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

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

Если кто-то может помочь прояснить, что было бы замечательно, спасибо.

1 Ответ

14 голосов
/ 03 июля 2019

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 .

...