什么是类型约束的类型?

Lau*_*ves 8 haskell ghc

例如,Num a => a.

我认为它们只是被称为"受约束的类型",但谷歌搜索没有出现该术语的许多用法,所以我很想知道它们是否有其他名称.

And*_*erg 7

具有这种特定约束的类型称为"限定类型",而特征本身有时称为"合格多态".我相信这个术语最初是由Mark Jones的ESOP '92论文引入的.

不应将合格类型与更具主流的"有界多态性"概念相混淆,"有界多态性"是Java等语言中的泛型.有界多态性本质上是参数多态与子类型的(相当复杂)组合,而合格类型在没有子类型的情况下相处.


Ada*_*ner 6

我不是类型理论专家,但经过一些研究,这就是我发现的(这可能有用也可能没有用,但我不能在评论中说明这一点).

Haskell的简要介绍:Classes调用Num a类型的上下文:

类型a必须是类Eq的实例的约束是Eq a.因此,Eq a不是类型表达式,而是表达对类型的约束,并称为上下文.

所以我想你可以说"带有上下文的类型",或者你提到的"约束类型".

另一个值得关注的地方是Haskell首先描述的类型类(我相信):如何使ad-hoc多态性不那么特别 [postscript].

类型类似乎与面向对象编程,类型的有限量化和抽象数据类型[CW85,MP85,Rey85]中出现的问题密切相关.下面概述了一些连接,但需要做更多工作才能完全理解这些关系.

这篇论文写于1988年,所以我不确定这些关系现在是否已被完全理解,但是有限量化的维基百科页面没有提到Haskell,所以我不确定它是完全相同的.(再一次,不是一个类型的理论家 - 只是一个喜欢Haskell的人)

另外,关于square :: Num a => a -> a它所说的类型:

这个被读取时," square已键入a -> a,对于每一个a,使得a属于类别Num(即,使得(+),(*)和求反是在定义的a)".

你可以说类型"属于一个类".

这就是我所拥有的一切.就个人而言,我认为"约束类型"或"类型限制为类"工作正常.


Hea*_*ink 6

Num a =>部分确实称为约束; 你可以把它读作"如果Num a是真的那么......"

通常,约束和量词一起讨论.任何约束类型都可以转换为等效类型,其中约束仅出现在内部forallexists量词中.因此,您不会听到"约束类型",因为您会听到"约束参数多态"(forall a. C => T),"约束存在类型"(exists a. C => T)或"约束多态"(两种量词).

相关术语是"有界多态".有界多态通常意味着受约束的多态性,其中约束是子类型或超类型约束.但是,并没有严格遵循这种区别.在像Java或Scala这样的子类型的语言中,您经常会听到任何称为"绑定"的约束.


Ste*_*ans 6

"合格类型".见Mark P. Jones.合格类型:理论与实践.剑桥大学出版社,剑桥,1994年.

Google上有很多相关的比赛.