首页 > 解决方案 > Haskell中不同类型之间的关系

问题描述

据我了解,Haskell 中有 4 种“类型”:

问题是:

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

我是 Haskell 的新手。

标签: haskelltypesnomenclature

解决方案


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

声明引入了一种data新类型( 的左侧=)和表示该类型数据的方法( 的右侧=)。

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

data SomeType = SomeConstructor

然后,您介绍了一种名为 的新类型SomeType,以及一种构造 的值的方法SomeType,即构造函数SomeConstructor(顺便说一句,它没有任何参数,因此是该类型的唯一值)。

类型类不做这些事情中的任何一件(a 也不做instance)。类型类引入了一个约束和一堆多态函数,如果满足该约束,这些函数应该可用。通过为这些功能提供实现, Aninstance基本上是在说“这种类型符合这个约束”。所以 aclass并不是真正引入新类型,它只是为现有类型提供临时多态性的一种方式。

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

class Show a where -- a is an instance of Show if
   show :: a -> String -- it has a function called show with this signature

(请注意,实际的ShowPrelude并不这样)

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

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

这个例子看起来像这样

instance Show SomeType where
  show SomeConstructor = "SomeConstructor"

意思是

SomeType满足约束Show,我将通过提供一个实现来向您展示如何show

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


推荐阅读