scala - scala 中的函数库(如 Cats 和 ScalaZ)中的类型类与数据类型

标签 scala scalaz scala-cats

ScalaZ 和 Cats 都具有类型类和数据类型的概念。

虽然我了解类型类和类型类实例,但我不了解它们对术语“数据类型”的使用。

KleisiEither 这样的东西被称为 “数据类型” - 为什么?我的理解是它们是“可能”使用这些类型类实现的通用功能,但是即使在 Scala 中的 FP 编程一书中,它们也没有被称为 “数据类型”

不知道这个词是怎么来的?

例子:

最佳答案

我想说这主要是 Haskell 的影响:

  • 您在 Haskell 中声明为 class 的所有内容都称为“类型类”,通常位于 cats._
  • 您在 Haskell 中声明为 data 的所有内容都称为“数据类型”,并以 cats.data._
  • 结尾
  • 通常在 Haskell 中使用 instance 关键字实现的类型类的实例都在 cats.instances._

“类型类”是一个保留短语,具有相当精确的含义:它是一种语言特性或设计模式,可以实现即席多态。它发生在多种语言中。实现细节可能有所不同(它内置在 Haskell 中,但通过 Scala 中具有(更高种类的)类型参数的类进行模拟),但本质或多或少是相同的。

“数据类型”似乎没有任何如此精确的含义——至少它与“代数数据类型”或“广义代数数据类型”不同。我目前的猜测是,它或多或少是“在 Haskell 中使用 data 关键字声明的所有内容”的通俗术语,因此,本质上,它只是代表某些数据结构的一堆类可以以类型安全的方式使用和组合。

关于scala - scala 中的函数库(如 Cats 和 ScalaZ)中的类型类与数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56877695/

相关文章:

arrays - 是否可以使用 assertResult 在 ScalaTest 中检查数组是否相等

scala - Play 框架 scala 应用程序中的数据库事务 (anorm)

scala - 如何使用 Name 作为应用程序?

java - Spring Security @Secured注解和Scala Controller

validation - Scala 2.10 中验证和扩展构造函数参数的最佳方法

scala - 将 (A => (M[B], M[C])) 转换为 (A => M[(B, C)])

scala - 不理解 scalaz 中的行为

scala - 如何堆叠 State 和 IO monad

scala - 新版本的 fs2 (0.10.x) 中的 fs2.Scheduler 等效于什么

scala - 为什么可以写柯里化(Currying)?