Haskell中不同类型之间的关系

Lan*_*ard 2 haskell types nomenclature

根据我的理解,Haskell中有4种"类型":

  • 代数数据类型 data
  • 数据类型构造函数(=data类型之后是什么; 在技术上不是类型,我不认为)
  • 输入别名 type
  • 类型与 class
  • 键入实例 instance

问题是:

  1. 如果Haskell中有更多种类型.如果是这样,有什么关系.
  2. data类型和class类型类之间的区别是什么.它们看似相似,但显然它们有一些不同的特征.与(3)相同.
  3. data类型和instance类型类实例之间的区别是什么.

我是Haskell的新手.

Cub*_*bic 6

datanewtype引入新类型(或实际类型构造函数 - Maybe不是类型,但是Maybe a任何a类型的类型).

一个data声明引入了两个新的类型(还剩下些什么的=)和一个方式来表示这种类型的数据(这是什么的权利=).

例如,如果您有这样的数据声明:

data SomeType = SomeConstructor
Run Code Online (Sandbox Code Playgroud)

然后你引入了一个名为的新类型SomeType,以及构造值的方法SomeType,即构造函数SomeConstructor(顺便提一下,它没有任何参数,因此是唯一存在于此类型中的值).

一个类型类没有做任何的这些事情(而且也没有一个instance).类型类引入了一个约束和一堆多态函数,如果满足该约束,它们应该是可用的.An instance基本上是通过为这些函数提供实现来说"这种类型满足此约束".因此,a class并不是真正引入新类型,它只是为现有类型提供ad-hoc多态的一种方法.

例如,Show类型类大致是这样的:

class Show a where -- a is an instance of Show if
   show :: a -> String -- it has a function called show with this signature
Run Code Online (Sandbox Code Playgroud)

(请注意,实际Show在课堂上Prelude十分像这样)

show现在有了类型Show a => a -> String,你可以读作

对于所有a,如果他们满足约束Show(或者,如果他们是一个实例Show),这是一个函数,它接受a一个字符串并返回一个字符串

这样的实例看起来像这样

instance Show SomeType where
  show SomeConstructor = "SomeConstructor"
Run Code Online (Sandbox Code Playgroud)

意思是

SomeType满足约束Show,我将通过提供实现来告诉你如何show

这大致是它的要点.有一些语言扩展允许类型类和实例发生更多相关事情,但您现在不需要担心.