Scala中的功能库(例如Cats和ScalaZ)中的类型类与数据类型

时间:2019-07-03 20:44:50

标签: scala scalaz scala-cats

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

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

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

我想知道这个词来自哪里吗?

示例:

1 个答案:

答案 0 :(得分:6)

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

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

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

“数据类型”似乎没有任何确切的含义-至少它与“代数数据类型”或“广义代数数据类型”不在同一个联盟中。我目前的猜测是,“您在Haskell中用data关键字声明的所有内容”或多或少是一个口语化的术语,因此,从本质上讲,它只是一堆类,它们代表可以以类型安全的方式使用和组成。