【问题标题】:Scala: Why lower bounds in existential type declaration not enforced?Scala:为什么不强制存在类型声明的下限?
【发布时间】:2013-03-27 00:08:24
【问题描述】:

假设在 Scala repl 中做了以下声明:

class Animal
class Bird extends Animal
class Chicken extends Bird
type SubType = t forSome { type t <: Bird }
type SuperType = t forSome { type t >: Bird }

正如我所料,SubType 属于符合Bird 的类型。由于AnimalBird 的超类,SubType 类型的变量不能保存Animal 类型的值:

scala> val foo: SubType = new Animal
<console>:10: error: type mismatch;
 found   : Animal
 required: SubType
       val foo: SubType = new Animal

然而这个推论并不像我预期的那样:

scala> val foo: SuperType = new Chicken
foo: SuperType = Chicken@1fea8dbd

分配成功,这些也成功了:

scala> val foo: SuperType = 2
foo: SuperType = 2

scala> val foo: SuperType = "wtf?"
foo: SuperType = wtf?

scala>

再次,这里是SuperType

type SuperType = t forSome { type t >: Bird }

根据SLS 4.3

类型声明 type t [tps ] >: L <: u> 声明t 是一个具有下限类型 L 和上限类型 U 的抽象类型。

所以我声明t 是一个具有下限Bird 的抽象类型。 Chicken 不是 Bird 的超类,StringInt 也不是。

我想这可能是因为ChickenAny,而SuperType 可以存储Any。但是如果我把SuperType的声明改成这样:

type SuperType = t forSome { type t >: Bird <: Animal}

设置Animal 的上限似乎没有任何改变。

问题

首先

我如何将 Chicken IntString 类型的值分配给存在性子句 { type t &gt;: Bird }{ type t &gt;: Bird &lt;: Animal} 允许的 SuperType 变量?

第二

引用规范中“A 类型声明 type t [tps ] >: L <: u> 声明 t 是一个抽象类型......”如果没有“抽象”这个词,意义会有什么不同?

【问题讨论】:

    标签: scala types covariance existential-type type-bounds


    【解决方案1】:

    我认为混淆是在使用术语“约束”和“约束”之间。 "<:>:" 语法结构用于指定类型约束,而不是边界。当你说

    { type t >: Bird } 
    

    您只是在限制类型“t”,使得该类型的居民必须与 Bird 共享一个超类。由于 Chicken 和 Bird 都扩展了 Animal,因此满足了约束,并且 Scala 允许赋值。这也是为什么您的“虚假”分配起作用的原因(String 和 Int 都与 Bird 共享超类 Any。您提出的后面的约束

    { type t >: Bird <: Animal } 
    

    适当地限制您的 String 和 Int 示例,因为 String 或 Int 的类型层次结构中不存在满足作为 Bird 的超类型同时也是 Animal 的子类型的约束的类型。但是,这仍然允许您进行初始分配。

    编辑:关于 SO 的其他答案说两者都称为边界。显示我知道多少。 :)

    【讨论】:

    • 所以你说 "{ type t >: Bird <: animal bird chicken>
    • 我相信是这样的。我承认,我发现您最初的示例也令人费解,但是在 REPL 中使用它之后,我相信我的答案是正确的。我们将不得不看看是否有 Scala 重量级人物来这里证明我错了。 :D
    • 所以,首先:如果 "a >: b" 约束类型 a 使得该类型的居民必须与 b 共享一个超类,那么 "a <: b nothing bird string forsome type t>:”的反义词吗??
    • 第二,你说“{ type t >: Bird }”是“限制类型't',使得该类型的居民必须与Bird共享一个超类。”不是每个类型都与 Bird 共享超类 Any 吗?如果是这样,那么什么是约束?要么我遗漏了一些假设的东西,要么 ">:" 是没有意义的,除非与 "<: any nothing>
    • 对延迟回复表示歉意。作为对您的第一条评论的回应,虽然 Nothing 是 Bird 和 String 的常见子类型,但两者的实例都不是 Nothing 的实例(实际上,Nothing 是一种无人居住的类型)。所有的鸟和弦都是“任何”,没有弦或鸟是虚无。
    猜你喜欢
    • 2021-04-17
    • 2010-10-01
    • 2017-07-30
    • 1970-01-01
    • 2011-04-16
    • 2012-05-07
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多