了解Scala FP库

Maa*_*mon 11 functional-programming scala scala-cats cats-effect zio

为了快速清晰起见,对于那些想开始使用Scala FP库的人,他们正准备变得精通纯FP。

有人可以澄清一下Cats和Cats-Effects,Cats-Effects IO之间的区别/关系吗?最重要的是,Zio和Monix对此持何立场?最后,与ScalaZ 7/8有什么关系?

到目前为止,根据我所读的内容,可以根据可用的文档很好地结合使用的库,它们的作用是Cats,Cats-Effect和ZIO(可以与Cats-effects一起使用)?但是我不太清楚为什么,并且想为自己设定一条学习如何成为更好的FP程序员的良好途径,同时保持生产力,并且不必在开始选择之前完成“ Scala FP编程”。

Krz*_*sik 16

Scalaz最初试图将Haskell的一些完善的抽象移植到Scala(例如Monad,Functor的类型类等等)。它的问题是,它没有很好的文档,因此,基本上,您需要使用Haskell库的文档才能了解如何使用某些Scalaz资源。如今,您可以使用Sam Halliday的《凡人功能编程》,您可以将其用作Scalaz的学习资源。

Cats是后来创建的,基本上是Scalaz提供的内容的重新实现。有很多更好的文档Scalaz,也有伟大的书 斯卡拉与猫

ScalazCats可能具有非常相似的用途,因此它们正在争夺Scala的通用FP库。也有两个库充当两个库之间的兼容性层

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

您可以在此处了解更多信息,因为当有标准库Future时,为什么需要Scala的IO monad 。

Monix是另一个库,它为Scala 提供IO monad,但这次称为Task。它旨在成为一个更高层次的抽象,并使用标准库Future提供更轻松的代码互操作。实际上,它与Cats-Effect共享许多代码,Monix Alexandru Nedelcu的创建者也是Cats-Effect的主要贡献者之一。
在这里您可以找到有关之间差异的详细信息cats.effect.IO,并monix.eval.Task,以及一些双方的历史。

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

关于所有库的妙处在于,它们都实现了Cats-Effect的类型类(例如SyncConcurrent),因此使用称为无标签final的模式可以在实现之间进行切换。

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

如果你不使用无标签最终你仍然可以使用提供互操作的某些模块之间的IO单子,例如ZIO-互操作-猫(间ZIO猫效应小睡Monix - 猫效应