理解 Scala FP 库

Making sense of Scala FP Libraries

只是为了让想要开始使用 Scala FP 库的人快速清楚地了解如何在纯 FP 方面做得更好。

有人能澄清一下 Cats 和 Cats-Effect、Cats-Effects IO 之间的 difference/relation 吗?最重要的是,Zio 和 Monix 在这方面的立场如何?最后,与 ScalaZ 7/8 有什么关系?

到目前为止,根据我所阅读的内容,基于可用文档和它们所做的工作的库的良好组合是 Cats,然后是 Cats-Effect,以及可以与 Cats 一起使用的 ZIO-影响?但我不太明白为什么,我想为自己设定一条好的途径,让自己学习成为更好的 FP 程序员,同时保持高效,并且不必在开始做出选择之前完成 "FP Programming in Scala"。

Scalaz 开始尝试将 Haskell 的一些 well-established 抽象移植到 Scala(例如 Monad、Functor 等的类型类)。它的问题是,它没有很好的文档,所以基本上,您需要使用 Haskell 库的文档才能了解如何使用某些 Scalaz 资源。 现在,你有 Sam Halliday 的 Functional Programming for Mortals,你可以将其用作 Scalaz.

的学习资源

Cats 是后来创建的,本质上是 Scalaz 提供的重新实现。 Cats documentationScalaz 好很多,还有一本很棒的书 Scala with Cats.

ScalazCats 可能具有非常相似的用途,因此它们作为 Scala 的通用 FP 库竞争。也有库作为compatibility-layer介于两个库之间。

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

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

Monix 是另一个库,它为 Scala 提供了一个 IO monad,但这次它被称为 Task。本来是更high-level abstraction and provide easier interop with code using standard library Future. In reality, it shares a lot of code with Cats-Effect and creator of Monix Alexandru Nedelcu也是Cats-Effect.
的主要贡献者之一 Here 您可能会找到更多关于 cats.effect.IOmonix.eval.Task 之间差异的信息,以及两者的一些历史。

最后,ZIO 开始尝试为 Scalaz[=89= 重新实现 IO monad ],但最终成为一个完全独立的库(因此它不依赖于 Scalaz 代码库)。

所有库的伟大之处在于,它们都实现了来自 [=45= 的类型类(如 SyncConcurrent) ]Cats-Effect,因此使用名为 tagless final 的模式,您可以在实现之间切换。

typeclasses 的层次结构也充当许多(所有(?))IO 实现(如到它创建时,已经有 fs2.Taskmonix.Taskscalaz.IO)。此外,显然,在 future 中, IO 部分可能会移动到另一个模块中,只留下互操作性 typeclasses.

如果你不使用无标签final你仍然可以使用在某些IO单子之间提供互操作的模块,例如zio-interop-cats(介于 ZIOCats-Effectcatnap 对于 Monix-Cats-Effect.


供您参考,我最近将此答案扩展为 full-fledged blog post