例如,Num a => a
。
我以为它们只是被称为“受限类型”,但谷歌搜索并没有出现该术语的很多用法,所以我很想知道它们是否有其他名称。
具有这种特定约束的类型称为“限定类型”,而特性本身有时称为“限定多态性”。我相信该术语最初是由Mark Jones 的 ESOP '92 论文引入的。
限定类型不应与更主流的“有界多态性”概念相混淆,Java 等语言中的泛型基于该概念。有界多态性本质上是参数多态性与子类型的(相当复杂的)组合,而合格的类型在没有子类型的情况下也能相处。
该Num a =>
部分确实称为约束;您可以将其解读为“如果Num a
是真的,那么……”
通常,约束和量词一起讨论。任何受约束的类型都可以转换为等效类型,其中约束仅出现在内部forall
或exists
量词中。因此,您不会像听到“受约束的参数多态性”(forall a. C => T
)、“受约束的存在类型”(exists a. C => T
)或“受约束的多态性”(这两种量词)那样经常听到“受约束的类型”。
一个相关的术语是“有界多态性”。有界多态性通常意味着受约束的多态性,其中约束是子类型或超类型约束。但是,并没有严格遵循这种区别。在 Java 或 Scala 等具有子类型的语言中,您经常会听到称为“绑定”的任何类型的约束。
“合格的类型”。见马克·琼斯。合格类型:理论与实践。剑桥大学出版社,剑桥,1994 年。
谷歌上有很多相关的比赛。
我不是类型理论专家,但通过一些研究,这就是我发现的(这可能有帮助,也可能没有帮助,但我不能在评论中加入这个)。
Haskell 简介:类调用Num a
类型上下文的部分:
类型 a 必须是类 Eq 的实例的约束写成 Eq a。因此,Eq a 不是类型表达式,而是表示对类型的约束,称为上下文。
所以我想你可以说“一个有上下文的类型”,或者你提到的“受约束的类型”。
另一个值得关注的地方是(我相信)为 Haskell 首次描述类型类的地方:How to make ad-hoc polymorphism less ad-hoc [postscript]。
类型类似乎与面向对象编程、类型的有界量化和抽象数据类型中出现的问题密切相关 [CW85, MP85, Rey85]。下面概述了一些联系,但需要做更多的工作才能充分理解这些关系。
这篇论文写于 1988 年,所以我不确定这些关系现在是否已被完全理解,但有界量化的维基百科页面没有提到 Haskell,所以我不确定它是否完全一样。(再一次,不是类型理论家——只是一个喜欢 Haskell 的人)
此外,关于square :: Num a => a -> a
它所说的类型:
这被读作“对于属于类的每个这样的类型(即,这样,,和否定定义在 上),
square
具有类型。”a -> a
a
a
Num
(+)
(*)
a
你可以说类型“属于一个类”。
这就是我所拥有的一切。就个人而言,我认为“受限类型”或“受限于类的类型”工作正常。
您可以将其称为有界多态类型(参见wikipedia)。