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页面中所给出的,参数化数据类型确实需要参数化多态性(至少是某种类型),而这样的类型只是参数化类型的一个示例。“抽象数据类型”的通常含义确实与参数多态性有着密切的联系。