我试图抓住这两个概念之间的关系。
首先考虑抽象数据类型:
的示例data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
根据Haskell wiki:
这种类型是抽象的,因为它保留了其结构的某些方面未定义,由数据类型的用户提供。这是抽象数据类型的弱形式。 Source
现在考虑参数多态的概念:
参数多态是指当值的类型包含一个或多个(无约束)类型变量时,该值可以采用通过用具体类型替换这些变量而产生的任何类型。 - Source
这里给出了一个id :: a -> a
的例子:
例如,函数
中包含无约束类型变量aid :: a -> a
在其类型
问题:这两个概念之间的正式关系是什么?特别是抽象数据类型的所有实例都是参数多态的实例?反之亦然?
答案 0 :(得分:1)
要实现两件事。首先,您的示例Tree
实际上是参数类型,这是一种特殊的抽象类型。其次,参数多态可以是类型或函数。考虑到这两点,很明显,抽象类型和参数多态性都不是另一个的超集。但是,任何参数多态(类型)也是抽象类型。换句话说,抽象类型 是参数化多态类型的超集(如果它们实际上被称为那么就是dunno)。
答案 1 :(得分:-2)
Tree
是抽象数据类型的原因,因为它没有指定有关 如何实现它的任何详细信息。如何为树添加值?你如何删除一个值?该类型仅定义树的结构:它是空的或存储类型a
的值的节点,并引用其他两个树。
参数多态不与该类型的结构或动力学有任何关系。相反,它指的是您实际上已经定义了相关类型的系列。无论您拥有Tree Int
,Tree Char
还是Tree (StateT (Int, Char) (MaybeT Float IO ()))
,实施方式都将保持不变。