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

2024-02-03

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

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

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

根据哈斯克尔维基:

这种类型是抽象的,因为它未定义其结构的某些方面,由数据类型的用户提供。这是抽象数据类型的弱形式。Source https://wiki.haskell.org/Abstract_data_type

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

参数多态性指的是当一个值的类型包含一个或多个(不受约束的)类型变量时,因此该值可以采用用具体类型替换这些变量所产生的任何类型。 --Source https://wiki.haskell.org/Polymorphism#Parametric_polymorphism

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

例如,函数id :: a -> a其类型中包含无约束类型变量 a

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


有两件事需要意识到。首先,你的例子Tree实际上是一个参数型,这是一种特殊的抽象类型。第二,参数多态性可以是类型或函数。考虑到这两点,很明显抽象类型和参数多态性都不是对方的超集。然而,任何参数多态性这是一种类型也是一个抽象类型。换句话说,抽象类型are的超集参数多态类型(不知道他们是否真的这么叫)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell 中的抽象数据类型与参数多态性 的相关文章

随机推荐