Haskell中的抽象数据类型与参数多态性
我试图掌握这两个概念之间的关系Haskell中的抽象数据类型与参数多态性,haskell,types,abstract,parametric-polymorphism,Haskell,Types,Abstract,Parametric Polymorphism,我试图掌握这两个概念之间的关系 首先考虑一个抽象数据类型< /强>: data Tree a = Nil | Node { left :: Tree a, value :: a, right :: Tree a } 根据Haskell维基: 此类型是抽象的,因为它使其结构的某些方面未定义,由数据类型的用户提供。这是抽象数据类型的一种弱形式 现在考虑参数多态性< /强>: data T
首先考虑一个<强>抽象数据类型< /强>:
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
根据Haskell维基:
此类型是抽象的,因为它使其结构的某些方面未定义,由数据类型的用户提供。这是抽象数据类型的一种弱形式
现在考虑<强>参数多态性< /强>:
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
参数多态性是指当值的类型包含一个或多个(无约束)类型变量时,该值可以采用通过用具体类型替换这些变量而产生的任何类型。--
这里给出了id::a->a
的示例:
例如,函数id::a->a
在其类型中包含一个无约束的类型变量a
问题:这两个概念之间的正式关系是什么?特别是,抽象数据类型的所有实例是否也都是参数多态性的实例?反之亦然呢?需要认识到两件事。首先,您的示例
树
实际上是一个参数化类型,它是一种特殊的抽象类型。其次,参数多态性可以是类型或函数。考虑到这两个因素,很明显,抽象类型和参数多态性都不是另一个的超集。然而,任何参数多态性都是一种类型也是一种抽象类型。换句话说,抽象类型是参数多态类型的超集(不知道它们是否真的被称为参数多态类型)。原因树是一种抽象数据类型,因为它没有指定关于如何实现它的任何细节。如何为树添加值?如何删除一个值?该类型仅定义树的结构:它要么是空的,要么是存储类型为a
的值并引用其他两棵树的节点
参数多态性与类型的结构或动力学无关。相反,它指的是您实际上已经定义了一系列相关类型。无论您有树Int
,或树Char
,或树(StateT(Int,Char)(MaybeT Float IO())
,实现都将保持不变。作为警告,这并不是人们通常所说的术语“抽象数据类型”,即使是引用的页面也会这样说。事实上,我觉得很奇怪,有人决定这样使用这个词。正如在那个wiki页面中所给出的,参数化数据类型确实需要参数化多态性(至少是某种类型),而这样的类型只是参数化类型的一个示例。“抽象数据类型”的通常含义确实与参数多态性有着密切的联系。