类型类

编辑
本词条由“匿名用户” 建档。

在计算机科学中,类型类是一种类型系统结构,支持临时多态性。这是通过在参数化的多态类型中为类型变量添加约束来实现的。这样的约束通常涉及到一个类型类T和一个类型变量a,并意味着a只能被实例化到一个其成员支持与T相关的重载操作的类型。在PhilipWadler和StephenBlott首次提出作为StandardML中eqtypes的扩展后,类型类首次在Haskell编程语言中实现,最初被认为是以一种原...

什么是类型类

编辑

计算机科学中,类型类是一种类型系统结构,支持临时多态性。这是通过在参数化的多态类型中为类型变量添加约束来实现的。这样的约束通常涉及到一个类型类T和一个类型变量a,并意味着a只能被实例化到一个其成员支持与T相关的重载操作的类型。在PhilipWadler和StephenBlott首次提出作为StandardML中eqtypes的扩展后,类型类首次在Haskell编程语言中实现,最初被认为是以一种原则性的方式实现重载算术和平等运算符。与StandardML的eqtypes相比,在Haskell中通过使用类型类重载平等运算符不需要对编译器前端或基础类型系统进行广泛修改。自从它们创建以来,已经发现了许多类型类的其他应用。

类型类的概述

编辑

类型类是通过指定一组函数或常量名称,以及它们各自的类型来定义的,每个属于该类的类型必须存在。在Haskell中,类型可以被参数化;一个旨在包含承认平等的类型的类型类Eq将被以如下方式声明。classEqawhere(==)::a->a->Bool(/=)::a->a->Bool其中a是Eq类的一个实例,a定义了2个函数(平等和不平等函数)的函数签名,这2个函数分别接受2个a类型的参数并返回一个布尔值。{displaystyle*}在最新的GHC版本中也被称为类型)。在最新的GHC版本中也被称为Type),意味着Eq的种类是Eq::类型->约束这个声明可以理解为,如果有适当类型的函数命名为(==)和(/=),在它上面定义了一个类型a属于类型类Eq。然后程序员可以用下面的方式定义一个函数elem(确定一个元素是否在一个列表中)。函数elem的类型是a->[a]->Bool,上下文是Eqa,它将a的范围限制在属于Eq类型的那些a上。(注意:Haskell=>可以被称为"类约束")。程序员可以通过使用定义了C的所有方法的实现的实例声明,使任何类型t成为给定的类型类C的成员。例如,如果程序员定义了一个新的数据类型t,他们可以通过以任何他们认为合适的方式对类型t的值提供一个平等函数,使这个新类型成为Eq的实例。一旦他们这样做了,他们就可以在[t]上使用函数elem,也就是t类型的元素的列表。请注意,类型类与面向对象编程语言中的类不同。特别是,Eq不是一个类型:不存在Eq类型的值这样的东西。类型类与参数多态性密切相关。例如,注意到上面指定的elem的类型将是参数多态的类型a->[a]->Bool,如果不是因为类型类的约束Eqa=>。

更高类型的多态性

编辑

一个类型类不需要取一个Type类型的变量,而是可以取一个任何类型的类型。这些具有更高种类的类型类有时被称为构造函数类(所指的构造函数是类型构造函数,如Maybe,而不是数据构造函数,如Just)。一个例子是单体类。m应用于一个类型变量的事实表明,它具有Type->Type的种类,即它接受一个类型并返回一个类型,Monad的种类就是这样。

通用类型系统

多参数类型类

编辑

类型类允许多个类型参数,因此类型类可以被看作是类型上的关系。例如,在GHC标准库中,IArray类表达了一个通用的不可变数组接口。在这个类中,类型类约束IArrayae意味着a是一个包含e类型元素的数组类型。(例如,这种对多态性的限制被用来实现非盒式数组类型)。像多方法一样,多参数类型类支持根据多个参数的类型来调用一个方法的不同实现,实际上还有返回类型。多参数类型类不需要在运行时的每次调用中搜索要调用的方法;相反,要调用的方法首先被编译并存储在类型类实例的字典中,就像单参数类型类那样。使用多参数类型类的Haskell代码是不可移植的,因为这个特性不是Haskell98标准的一部分。流行的Haskell实现,GHC和Hugs,支持多参数类型类。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170851/

(1)
词条目录
  1. 什么是类型类
  2. 类型类的概述
  3. 更高类型的多态性
  4. 多参数类型类

轻触这里

关闭目录

目录