3

我试图掌握这两个概念之间的关系。

首先考虑一个抽象数据类型的例子:

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

根据 Haskell 维基:

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

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

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

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

例如,函数id :: a -> a在其类型中包含一个不受约束的类型变量 a

问题:这两个概念之间的形式关系是什么?特别是,抽象数据类型的所有实例也是参数多态性的实例吗?反过来呢?

4

2 回答 2

1

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

于 2016-04-30T00:01:18.513 回答
-2

原因Tree是抽象数据类型,因为它没有指定有关如何实现它的任何细节。如何为树添加值?你如何删除一个值?类型只定义了树的结构:它要么是空的,要么是一个存储类型值a和对其他两棵树的引用的节点。

参数多态性与类型的结构或动态无关。相反,它指的是您实际上已经定义了一系列相关类型。无论您有 a Tree Int、 aTree Char还是 a Tree (StateT (Int, Char) (MaybeT Float IO ())),实现都将保持不变。

于 2016-04-30T00:27:13.350 回答