理解 Scala FP 库
Posted
技术标签:
【中文标题】理解 Scala FP 库【英文标题】:Making sense of Scala FP Libraries 【发布时间】:2019-11-14 01:14:54 【问题描述】:只是为了让那些想要开始使用 Scala FP 库的人快速清晰地了解如何在纯 FP 方面做得更好。
有人能澄清 Cats 和 Cats-Effect、Cats-Effects IO 之间的区别/关系吗?最重要的是,Zio 和 Monix 对此有何立场?最后,与 ScalaZ 7/8 有什么关系?
到目前为止,根据我所阅读的内容,基于可用文档的库的良好组合以及它们所做的将是 Cats,然后是 Cats-Effect,以及可以与 Cats-effects 一起使用的 ZIO?但我不太明白为什么,我想为自己设置一条好路径,让自己学习成为更好的 FP 程序员,同时保持生产力,并且在开始做出选择之前不必完成“Scala 中的 FP 编程”。
【问题讨论】:
查看kubuszok.com/2019/io-monad-which-why-and-how 【参考方案1】:Scalaz 最初是为了尝试将一些来自 Haskell 的成熟抽象(如 Monad、Functor 等的类型类)移植到 Scala。问题在于,它没有很好的文档,所以基本上,您需要使用 Haskell 库的文档来了解如何使用某些 Scalaz 资源。 如今,您可以使用 Sam Halliday 的 Functional Programming for Mortals 作为 Scalaz 的学习资源。
Cats 是后来创建的,本质上是对 Scalaz 提供的功能的重新实现。 Cats 比 Scalaz 有很多更好的 documentation,还有一本很棒的书 Scala with Cats。
Scalaz 和 Cats 可能具有非常相似的用途,因此它们作为 Scala 的通用 FP 库进行竞争。还有一些库在两个库之间充当compatibility-layer。
Cats-Effect 是一个库,它为 Scala 提供 “标准” IO monad(再次借鉴 Haskell (?) 的想法) .它依赖于 Cats 核心库中的代码。
你可以阅读更多here为什么需要 IO monad 用于 Scala,当有标准的库 Future 时。
Monix 是另一个库,它为 Scala 提供了一个 IO monad,但这次它被称为 Task
。它的本意是更 high-level abstraction,并使用标准库 Future 提供更轻松的代码互操作。实际上,它与 Cats-Effect 共享大量代码,Monix 的创建者 Alexandru Nedelcu 也是 Cats-Effect 的主要贡献者之一strong>。Here 您可以找到更多关于cats.effect.IO
和monix.eval.Task
之间差异的信息,以及两者的一些历史。
最后,还有 ZIO,它最初是为了尝试为 Scalaz 重新实现 IO monad,但最终成为一个完全独立的库(所以它不依赖于 Scalaz 代码库)。
所有库的伟大之处在于,它们都实现了来自 Cats-Effect 的类型类(如 Sync 或 Concurrent),所以使用名为 tagless final 的模式,您可以在实现之间切换。
typeclasses 的层次结构还用作许多(全部(?))IO 实现之间的插值库(当它在那里创建时)分别是fs2.Task
、monix.Task
和scalaz.IO
)。此外,显然,在future 中,IO 部分可能会移到另一个模块中,只留下互操作性 typeclasses。
如果您不使用 tagless final,您仍然可以使用在某些 IO monad 之间提供互操作的模块,例如 zio-interop-cats(ZIO 和 Cats-Effect 或 catnap 对于 Monix-Cats-Effect em>。
为了您的信息,我最近将此答案扩展为full-fledged blog post。
【讨论】:
难以置信的答案谢谢我明白了。可以分享您在此处引用的一些 Lib:“如果您不使用无标记 final,您仍然可以使用在某些 IO monad 之间提供互操作的库。” ??? 例如zio中有模块:zio-interop-cats
和monixmonix-catnap
。我将那段更改为使用单词modules
而不是libraries
,因为它具有误导性。以上是关于理解 Scala FP 库的主要内容,如果未能解决你的问题,请参考以下文章
一张图深入的理解FP/FN/Precision/Recall