例如,
我认为它们只是被称为“受限类型”,但Google搜索并没有找到许多使用该术语的内容,因此我很想知道它们是否有其他名称。
Num a => a
。我认为它们只是被称为“受限类型”,但Google搜索并没有找到许多使用该术语的内容,因此我很想知道它们是否有其他名称。
Num a
部分为该类型的上下文:square :: Num a => a -> a
,它说:square
的类型为a -> a
,对于每个a
,使得a
属于类Num
(即在a
上定义了(+)
、(*)
和negate)。”Num a =>
部分被称为约束条件,可以理解为“如果Num a
为真,则...”。通常情况下,约束条件和量词是一起讨论的。任何有约束条件的类型都可以转换为一个等效的类型,其中约束条件只出现在forall
或exists
量词的内部。因此,你不会经常听到“有约束条件的类型”,而是会经常听到“有约束参数多态性”(forall a. C => T
)、“有约束存在类型”(exists a. C => T
)或“有约束多态性”(这两种量词)。相关术语是“有界多态性”。有界多态性通常指约束多态性,其中约束是子类型或超类型约束。但是,在具有子类型的语言(如Java或Scala)中,这种区别并没有严格遵循。你经常会听到任何类型的约束都被称为“边界”。5
的类型时,它会显示 5 :: (Num t) => t
。你是说这实际上是一个 forall
还是 exists
?如果是这样,那么是哪一个? - Laurence Gonsalvesforall t。 (Num t)=> t
。 类型中的自由变量隐式地量化为forall
。 没有“exists”关键字; 存在类型仅与数据构造函数结合使用。 - Heatsink>>=
方法和 Eq 的 ==
方法都有使用其实例中“更具体”的参数的方法。 - Laurence Gonsalvesforall a. a<:T => ...
只是量词中一种谓词,类似于 forall a. N(a) => …
(在这里是在谓词逻辑中思考)。也许更好的表达应该是“类约束的多态类型”。但在这里,我认为简单的“约束类型”更为简单明了。 - phipsgabler
<T extends Foobar>
这样的类型约束。 - sepp2kmyMethod<Integer>
或myMethod<Float>
来明确要求某种类型的Number)。当然,除非它还接受至少一个类型为T的参数,否则不可能定义任何有用的方法(指不仅仅是返回null的方法)。 - sepp2k