对于那些想开始使用Scala FP库的人来说,只是为了快速清晰起见,就可以使它在纯FP方面变得更好。
有人可以澄清Cats和Cats-Effects,Cats-Effects IO之间的区别/关系吗?最重要的是,Zio和Monix对此持何立场? 最后,与ScalaZ 7/8有什么关系?
到目前为止,根据我所读的内容,可以根据可用的文档很好地组合要使用的库,它们的作用是Cats,然后是Cats-Effect,以及可以与Cats-effects一起使用的ZIO?但是我不太清楚为什么,并且想为自己设定一条学习如何成为更好的FP程序员的良好道路,同时保持生产力,并且不必在开始选择之前完成“ Scala FP编程”。
如果有人可以帮助澄清一些很棒的事情,谢谢。
答案 0 :(得分:14)
Scalaz 开始是为了将来自Haskell的一些完善的抽象移植到Scala(例如Monad,Functor的类型类等等)。问题在于它没有很好的文档,因此,基本上,您需要使用Haskell库的文档才能了解如何使用某些 Scalaz 资源。 如今,您有Sam Halliday的凡人功能编程,您可以将其用作 Scalaz 的学习资源。
猫是后来创建的,实际上是重新实现了 Scalaz 所提供的内容。 Cats (猫)比 Scalaz 好得多,还有一本好书 Scala with Cats 。
Scalaz 和 Cats 可能具有非常相似的用途,因此它们正在争夺Scala的通用FP库。这两个库之间也有充当documentation的库。
Cats-Effect 是一个库,它为Scala提供“标准” IO monad (再次从Haskell(?)借来的想法) 。它取决于 Cats 核心库中的代码。
您可以了解更多compatibility-layer,为什么在标准库 Future 下,为什么Scala需要 IO monad。
Monix 是另一个库,它为Scala提供了 IO monad ,但这次被称为Task
。它本来可以成为here的更多用户,并且可以使用标准库 Future 与代码进行更轻松的互操作。实际上,它与 Cats-Effect 共享许多代码, Monix 的创建者high-level abstraction也是 Cats-Effect的主要贡献者之一。
Alexandru Nedelcu,您可能会找到有关cats.effect.IO
和monix.eval.Task
之间差异的更多信息,以及两者的历史记录。
最后,有一个 ZIO ,其开始是为 Scalaz 重新实现 IO monad 的尝试,但最终成为了一个完全独立的库(因此它不依赖于 Scalaz 代码库)。
关于所有库的妙处在于,它们都实现了 Cats-Effect 的类型类(例如 Sync 或 Concurrent ),因此使用称为 tagless final 的模式,您可以在实现之间进行切换。
类型类的层次结构还用作许多(所有(?)) IO 实现之间的插值库(截至在那儿创建时)是fs2.Task
,monix.Task
和scalaz.IO
)。同样,很明显,在Here中, IO 部分可能移到了另一个模块中,只留下了互操作性 typeclasss 。
如果您不使用 tagless final ,您仍然可以使用在某些 IO 单子之间提供互操作的模块,例如 zio-interop-cats (介于 ZIO 和 Cats-Effect 之间或 catnap 用于 Monix - Cats-Effect 。