scala - 理解 Scala FP 库

标签 scala functional-programming scala-cats cats-effect zio

只是为了让那些想要开始使用 Scala FP 库、踏上变得更好的纯 FP 之旅的人快速了解清楚。

有人能澄清一下 Cats 和 Cats-Effect、Cats-Effects IO 之间的区别/关系吗?最重要的是,齐奥和莫尼克斯对此有何看法?最后,与 ScalaZ 7/8 有何关系?

到目前为止,根据我所读到的内容,根据可用文档及其功能,可以使用的库的良好组合是 Cats,然后是 Cats-Effect,以及可以与 Cats-effects 一起使用的 ZIO?但我不太明白为什么,并且想为自己设定一条很好的途径来学习成为更好的 FP 程序员,同时保持生产力,并且在开始做出选择之前不必完成“Scala 中的 FP 编程”。

最佳答案

Scalaz 最初是尝试将 Haskell 中的一些成熟的抽象移植到 Scala(例如 Monad、Functor 等的类型类)。问题是,它没有很好的文档,所以基本上,您需要使用 Haskell 库的文档才能了解如何使用某些 Scalaz 资源。 如今,Sam Halliday 的面向凡人的函数式编程可以用作Scalaz的学习源。

Cats 后来创建,本质上是重新实现 Scalaz 提供的内容。 有很多更好的documentation除了Scalaz之外,还有一本很棒的书Scala with Cats

ScalazCats 可能具有非常相似的用途,因此它们作为 Scala 的通用 FP 库进行竞争。还有一些库充当 compatibility-layer两个库之间。

Cats-Effect 是一个库,它为 Scala 提供“标准” IO monad(同样是从 Haskell 借用的想法(?)) 。它取决于 Cats 核心库中的代码。

您可以阅读更多here当有标准库Future时,为什么 Scala 需要 IO monad。

Monix 是另一个库,它为 Scala 提供了IO monad,但这次它被称为 Task。它本来应该是一个更多high-level abstraction并使用标准库“Future”提供更轻松的代码互操作。实际上,它与 Cats-EffectMonix 的创建者 Alexandru Nedelcu 共享大量代码。也是猫效应的主要贡献者之一。
Here您可能会找到有关 cats.effect.IOmonix.eval.Task 之间差异的更多信息,以及两者的一些历史。

最后,ZIO 最初是尝试为 Scalaz 重新实现 IO monad,但最终成为一个完全独立的库(所以它不依赖于Scalaz代码库)。

所有库的伟大之处在于,它们都从 Cats-Effect 实现类型类(例如 SyncConcurrent),所以使用名为 tagless Final 的模式,您可以在实现之间切换。

类型类的层次结构还充当许多(所有(?))IO实现之间的插值库(当它被创建时已经在那里)分别是 fs2.Taskmonix.Taskscalaz.IO)。另外,显然,在 futureIO部分可以移至另一个模块,只留下互操作性类型类

如果您不使用tagless Final,您仍然可以使用在某些IO monad 之间提供互操作的模块,例如zio-interop-cats(在ZIOCats-EffectMonixcatnap之间-Cats-Effect.

<小时/>

供您引用,我最近将此答案扩展为 full-fledged blog post .

关于scala - 理解 Scala FP 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56868566/

相关文章:

IntelliJ : could not find an output directory 中的 Scala 编译错误

javascript - Redux:修改Reducers中的状态,可以接受吗?

haskell - 为什么我们使用折叠将数据类型编码为函数?

scala - 将列表[Either[A, B]] 转换为Either[List[A], List[B]]

java - 如何打开“玩”! Intellij IDEA 2.0 控制台?

scala - 如何在对象上调用 '!=' 方法?

scala - 如何使用 apply/unapply 方法重现案例类行为?

javascript - 这些线在做什么?

scala - Kleisli 列表到 Kleisli 列表

scala - cats scala中的monad更改器(mutator)