Разбираемся с библиотеками Scala FP

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

Может ли кто-нибудь прояснить разницу / связь между Cats и Cats-Effect, Cats-Effects IO? Вдобавок каковы позиции Зио и Моникс по этому поводу? Наконец, какое отношение будет к ScalaZ 7/8?

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


person MaatDeamon    schedule 03.07.2019    source источник
comment
Посетите kubuszok.com/2019/io-monad-which-why -и-как   -  person Lasf    schedule 03.07.2019


Ответы (1)


Scalaz начался как попытка перенести на Scala некоторые хорошо зарекомендовавшие себя абстракции из Haskell (например, классы типов для Monad, Functor и многие другие). Проблема заключалась в том, что у него нет хорошей документации, поэтому в основном вам нужно было использовать документацию библиотек Haskell, чтобы понять, как использовать определенные ресурсы Scalaz. В настоящее время есть книга Сэма Халлидея Функциональное программирование для смертных, которую вы можете использовать в качестве учебного пособия для Scalaz.

Кошки были созданы позже, по сути, как повторная реализация того, что предоставил Scalaz. Cats содержит гораздо лучшую документацию, чем Scalaz, есть также отличная книга Scala with Cats.

Scalaz и Cats могут иметь очень похожие цели, поэтому они конкурируют как универсальная библиотека FP для Scala. Существуют также библиотеки, которые служат уровнем совместимости между обеими библиотеками.

Cats-Effect - это библиотека, которая предоставляет стандартную монаду ввода-вывода для Scala (идея снова заимствована из Haskell (?)). Это зависит от кода из основной библиотеки Cats.

Дополнительную информацию можно найти здесь зачем нужна монада IO для Scala, когда есть стандартная библиотека Future.

Monix - еще одна библиотека, которая предоставляет монаду ввода-вывода для Scala, но на этот раз она называется Task. Это должно было быть более абстракцией высокого уровня и упростить взаимодействие с кодом с помощью стандартной библиотеки Future. На самом деле он имеет много общего с Cats-Effect и создателем Monix Александру Недельку также является одним из основных участников Cats-Effect.
Здесь вы можете найти дополнительную информацию о различиях между cats.effect.IO и monix.eval.Task, а также некоторую историю обоих.

Наконец, есть ZIO, который начался как попытка переопределить монаду ввода-вывода для Scalaz, но в итоге превратился в совершенно отдельную библиотеку (так что не зависит от кодовой базы Scalaz).

Самое замечательное во всех библиотеках то, что все они реализуют классы типов (например, Sync или Concurrent) из Cats-Effect, поэтому использование шаблона называется окончательный вариант без тегов, вы можете переключаться между реализациями.

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

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


Для вашего сведения, я недавно расширил этот ответ до полноценного сообщение в блоге.

person Community    schedule 03.07.2019
comment
Невероятный ответ, спасибо, я все понял. Могли бы поделиться некоторыми из тех Lib, о которых вы говорите здесь: Если вы не используете окончательный вариант без тегов, вы все равно можете использовать библиотеки, которые обеспечивают взаимодействие между определенными монадами ввода-вывода. ??? - person MaatDeamon; 04.07.2019
comment
Например, в zio есть модуль: zio-interop-cats и для monix monix-catnap. Я изменил этот абзац, чтобы использовать слово modules вместо libraries, потому что оно вводило в заблуждение. - person Krzysztof Atłasik; 04.07.2019