gpt4 book ai didi

scala - Scala 可以注意到路径相关类型之间的身份吗?

转载 作者:行者123 更新时间:2023-12-05 01:34:28 26 4
gpt4 key购买 nike

有时在 Scala 中,我发现与路径相关的类型相关的类型不匹配,但我可以很容易地推断出实际上这些类型是一致的。这是一个简单的例子:

trait Foo { trait Bar }

object Main extends App {
val foo1 = new Foo { }
val foo2 = foo1

def turkle(x: foo1.Bar) {}

turkle(new foo2.Bar {})
}

它给出:“类型不匹配;找到:需要 Main.foo2.Bar 的 java.lang.Object:Main.foo1.Bar”。

现在当然是路径 Main.foo1.BarMain.foo2.Bar必须一致,因为我们写了 val foo2 = foo1 .我们可以通过将最后一行更改为
turkle((new foo2.Bar {}).asInstanceOf[foo1.Bar])

编译和运行都无一异常(exception)。

Can Scala automatically perform reasoning like this? If so, how can I make this happen?



(如果没有,是否有朝这个方向扩展类型系统的前景?)

我会注意到,有时 Scala 确实会执行这种推理。假设我改变 trait Fooobject Foo :
object Foo { trait Bar }

object Main extends App {
val foo1 = Foo
val foo2 = foo1

def turkle(x: foo1.Bar) {}

turkle(new foo2.Bar {})
}

现在一切都编译正常:不知何故 Scala 已经计算出 Main.foo1.BarMain.foo2.Bar真的是一样的 Foo.Bar .

最佳答案

Iulian Dragos 给了 the answer you need在最近的一个问题中。简短版本是编译器不进行流分析,因此在您的第一个示例中,它无法判断 foo1.Bar 和 foo2.Bar 是同一类型,因为 foo1 和 foo2 只是 Foo 类型。但是在第二个示例中, foo1 被推断为单例类型 Foo.type(Foo 的子类型),因此事情按预期工作。

您可以通过将 foo2 声明为 foo1 的单例类型来使您的第一个示例工作:

val foo2:foo1.type = foo1

请参阅 Scala 语言规范 2.9 的第 3.2.1 节以供引用。

关于scala - Scala 可以注意到路径相关类型之间的身份吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com