Haskell 具有类型约束的类型称为什么?

Haskell 具有类型约束的类型称为什么?,haskell,ghc,Haskell,Ghc,例如,numa=>a 我假设它们只是被称为“受限类型”,但谷歌搜索并没有发现该术语的很多用法,所以我很想知道它们是否有其他名称。你可以称之为有界多态类型(参见)。我不是类型论专家,但通过一些研究,这就是我发现的(这可能有帮助,也可能没有帮助,但我无法在评论中说明这一点) 调用类型上下文中的Num a部分: 类型a必须是类Eq的实例的约束是 因此,等式a不是一个类型表达式,而是它 表示类型上的约束,称为上下文 所以我想你可以说“有上下文的类型”,或者像你提到的“受限类型” 另一个要看的地方是Has

例如,
numa=>a


我假设它们只是被称为“受限类型”,但谷歌搜索并没有发现该术语的很多用法,所以我很想知道它们是否有其他名称。

你可以称之为有界多态类型(参见)。

我不是类型论专家,但通过一些研究,这就是我发现的(这可能有帮助,也可能没有帮助,但我无法在评论中说明这一点)

调用类型上下文中的
Num a
部分:

类型a必须是类Eq的实例的约束是 因此,等式a不是一个类型表达式,而是它 表示类型上的约束,称为上下文

所以我想你可以说“有上下文的类型”,或者像你提到的“受限类型”

另一个要看的地方是Haskell:[postscript]的类型类(我相信)最先被描述的地方

类型类似乎与中出现的问题密切相关 面向对象编程,类型的有界量化,以及 抽象数据类型[CW85、MP85、Rey85]。有些连接是 概述如下,但需要更多的工作来理解这些 关系充分

这篇论文是1988年写的,所以我不确定这些关系现在是否被完全理解,但维基百科的页面上没有提到哈斯克尔,所以我不确定它是否完全是同一件事。(再一次,不是一个类型理论家——只是一个喜欢哈斯克尔的人)

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

这是这样写的,“
square
具有类型
a->a
,对于
a
所属的每个
a
分类
Num
(即
(+)
(*)
)和否定在
a
上定义)

你可以说类型“属于一个类”


就我个人而言,我认为“受限类型”或“受限于类的类型”可以很好地工作。

这个
Num a=>
部分实际上被称为约束;你可以把它理解为“如果
Num a
是真的,那么…”

通常,约束和量词一起讨论。任何约束类型都可以转换为等价类型,其中约束仅出现在所有或存在的量词中。因此,您不会像听到“约束参数多态性”那样经常听到“约束类型”(
forall a.C=>T
)、“受限存在类型”(
exists a.C=>T
)或“受限多态性”(两种量词)

一个相关术语是“有界多态性”。有界多态性通常指约束为子类型或超类型约束的受约束多态性。然而,这种区别并没有严格遵循。在具有子类型的语言(如Java或Scala)中,您经常会听到任何类型的约束称为“有界”。

限定类型参见马克·琼斯:《合格类型:理论与实践》,剑桥大学出版社,剑桥,1994年


很多相关的。

具有这种特殊约束的类型被称为“限定类型”,功能本身有时也被称为“限定多态性”。我相信这个术语最初是由


限定类型不应与“有界多态性”这一更为主流的概念混淆,Java等语言中的泛型就是基于这种概念的参数多态性与子类型的结合,而限定类型则不需要子类型。

我不喜欢haskell,但你说的是可枚举类型吗?@SimonAndréForsberg不,他不喜欢。你怎么看这里的枚举?他说的是Java中的类型约束,比如
。@sepp2k我解释过“带有类型约束的类型”是“只允许有一个特定值的类型”。感谢Java示例,这是我的语言;)好吧,那么,另一次尝试(我的第二次也是最后一次尝试):你是在说“泛型”吗?我想“标记足以表明我在谈论Haskell中的某些内容,而不是Java:-”该页面上的短语“通用或存在量词,其范围仅限于特定类型的子类型”,让我怀疑。尽管Haskell类型类看起来与Java中的接口非常相似,但我认为它们提供的并不是真正的“子类型”。如果它们是子类型,那就意味着类型系统违反了LSP。例如,
>=
Monad的
=
方法和
=
Eq的
=
方法都有在其实例中采用“更具体”参数的方法。我同意,Haskell当然没有子类型(实际上使用了这个术语),如果你真的认为它是字面意义上的“有界量化”,它看起来和我很相似。a…只是量词中的一种谓词,类似于所有a的
。N(a)=>…
(在这里用谓词逻辑思考)。也许更好的表达式应该是“类有界多态类型”。但是在这里,我发现简单的“约束类型”非常简单。关于OOP和有界量化之间的关系:当我向ghci询问
5
的类型时,它说
5::(Num t)=>t
。你是说这实际上是一个所有的
存在的
?如果是,哪一个?@LaurenceGonsalves该类型为所有t的
。(Num t)=>t
。类型中的自由变量通过
forall
隐式量化。没有
存在
关键字;存在类型仅与数据构造函数组合出现。