理解Scala函数式编程库

27

为了方便想开始使用Scala FP库,成为更好的纯FP开发者的人快速了解,请有人澄清一下Cats和Cats-Effect、Cats-Effects IO之间的区别/关系。此外,Zio和Monix在其中的地位如何?最后,ScalaZ 7/8与之的关系是什么?

就目前我所读到的内容而言,根据可用文档和它们的功能来选择要使用的库的一个好组合将是Cats,然后是Cats-Effect,并且可以与Cats-Effects IO一起使用ZIO。但我无法很好地理解其原因,并希望为自己设定一个良好的学习路径,以成为更好的FP程序员,同时保持高效并不必在完成“Scala FP编程”之前就开始做出选择。


3
请访问https://kubuszok.com/2019/io-monad-which-why-and-how/。 - Lasf
1个回答

58

Scalaz起初是为了将一些来自Haskell的成熟抽象(如Monad、Functor等类型类)移植到Scala中。问题在于,它没有很好的文档,因此基本上需要使用Haskell库的文档才能理解如何使用某些Scalaz资源。 现在,你可以使用Sam Halliday的《Functional Programming for Mortals》作为学习Scalaz的来源。

Cats稍后创建,本质上是重新实现了Scalaz提供的内容。 CatsScalaz有更好的文档,还有伟大的书籍《Scala with Cats》。

ScalazCats可能具有非常相似的目的,因此它们作为Scala的通用FP库而竞争。还有一些库,可以作为两个库之间的兼容层

Cats-Effect是一个库,为Scala提供了“标准”IO monad(再次从Haskell(?)借鉴的想法)。它依赖于Cats核心库的代码。

你可以在这里了解更多关于Scala中为什么需要IO单子,当有标准库Future的时候。
另一个提供Scala的IO monad的库是Monix,但这次它被称为Task。它旨在提供更高级抽象并提供更容易与使用标准库Future的代码进行交互。实际上,它与Cats-Effect共享很多代码,而Monix的创建者Alexandru Nedelcu也是Cats-Effect的主要贡献者。
这里您可以找到有关cats.effect.IOmonix.eval.Task之间差异的更多信息,以及两者历史的一些内容。
最后,还有ZIO,它起初是试图为Scalaz重新实现IO monad,但最终成为一个完全独立的库(因此不依赖于Scalaz代码库)。
所有类型库的一个重要特点是,它们都在实现来自Cats-Effect的类型类(例如SyncConcurrent)。因此,使用称为tagless final的模式,您可以在不同实现之间切换。
这个类型类层次结构也作为插值库,在许多(甚至所有?)IO实现之间提供插值功能。例如,当创建该库时,已经有了fs2.Taskmonix.Taskscalaz.IO。而且,显然,将来IO部分可能会移动到另一个模块中,只留下互操作类型类。
如果您不使用tagless final,仍然可以使用提供特定IO单子之间相互操作的模块,例如zio-interop-cats(在ZIOCats-Effect之间)或catnap(在Monix-Cats-Effect之间)。

提供信息,我最近将这个答案扩展成了完整的博客文章


1
惊人的答案,谢谢,我全都懂了。你能分享一些你在这里提到的库吗:"如果您不使用标签终极(tagless final),您仍然可以使用提供特定 IO Monad 之间互操作性的库。"? - MaatDeamon
例如,在zio中有一个模块:zio-interop-cats,而在monix中则是monix-catnap。我将该段落中的“libraries”一词更改为“modules”,因为它会产生误导。 - Krzysztof Atłasik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接