抽象数据类型与Haskell中的参数多态性

时间:2016-04-29 22:02:12

标签: haskell types abstract parametric-polymorphism

我试图抓住这两个概念之间的关系。

首先考虑抽象数据类型

的示例
data Tree a = Nil 
            | Node { left  :: Tree a,
                     value :: a,
                     right :: Tree a }

根据Haskell wiki:

  

这种类型是抽象的,因为它保留了其结构的某些方面未定义,由数据类型的用户提供。这是抽象数据类型的弱形式。 Source

现在考虑参数多态的概念:

  

参数多态是指当值的类型包含一个或多个(无约束)类型变量时,该值可以采用通过用具体类型替换这些变量而产生的任何类型。 - Source

这里给出了一个id :: a -> a的例子:

  

例如,函数id :: a -> a在其类型

中包含无约束类型变量a

问题:这两个概念之间的正式关系是什么?特别是抽象数据类型的所有实例都是参数多态的实例?反之亦然?

2 个答案:

答案 0 :(得分:1)

要实现两件事。首先,您的示例Tree实际上是参数类型,这是一种特殊的抽象类型。其次,参数多态可以是类型或函数。考虑到这两点,很明显,抽象类型和参数多态性都不是另一个的超集。但是,任何参数多态(类型)也是抽象类型。换句话说,抽象类型 参数化多态类型的超集(如果它们实际上被称为那么就是dunno)。

答案 1 :(得分:-2)

Tree是抽象数据类型的原因,因为它没有指定有关 如何实现它的任何详细信息。如何为树添加值?你如何删除一个值?该类型仅定义树的结构:它是空的或存储类型a的值的节点,并引用其他两个树。

参数多态不与该类型的结构或动力学有任何关系。相反,它指的是您实际上已经定义了相关类型的系列。无论您拥有Tree IntTree Char还是Tree (StateT (Int, Char) (MaybeT Float IO ())),实施方式都将保持不变。