gpt4 book ai didi

Scala 编译错误 : not found: type _$1

转载 作者:行者123 更新时间:2023-12-04 11:26:03 28 4
gpt4 key购买 nike

我正在研究 Scala 中的存在类型 2.12.x .为此,我正在测试以下代码:

trait Parent
class ChildA extends Parent
class ChildB extends Parent

def whatIsInside(opt: Option[_ <: Parent]): String = {
opt match {
case _: Option[_ <: ChildA] => "ChildA"
case _: Option[_ <: ChildB] => "ChildB"
case _ => throw new IllegalArgumentException("unknown type")
}
}


whatIsInside(Some(new ChildA))
由于类型删除,我不希望这在运行时起作用,但是这甚至无法编译。我收到以下错误:
[error] ExistentialTypes.scala:12:24: not found: type _$2
[error] case _: Option[_ <: ChildA] => "ChildA"
[error] ^
[error] ExistentialTypes.scala:13:24: not found: type _$3
[error] case _: Option[_ <: ChildB] => "ChildB"
[error] ^
有人可以解释这些错误吗?

最佳答案

(不是完整的答案,而是一些注释和链接;也许它可以作为其他人的起点)
在2.12.13,编译器好像可以证明F[_ <: X]F[X]如果 X 是相同的类型发生在协变位置:

println(implicitly[Option[_ <: ChildA] =:= Option[ChildA]])
这编译(有警告,但它编译):
trait Parent
class ChildA extends Parent
class ChildB extends Parent

def whatIsInside(opt: Option[_ <: Parent]): String = {
opt match {
case _: Option[ChildA] => "ChildA"
case _: Option[ChildB] => "ChildB"
case None => "None"
case _ => throw new Error("meh")
}
}
这不编译:
trait Parent
class ChildA extends Parent
class ChildB extends Parent

def whatIsInside(opt: Option[_ <: Parent]): String = {
opt match {
case _: Option[_ <: ChildA] => "ChildA"
case _: Option[_ <: ChildB] => "ChildB"
case None => "None"
case _ => throw new Error("meh")
}
}
因此,它似乎与合成 _$2 的边界推断有关。类型变量。
此外,这编译:
def testConforms[A >: Nothing <: ChildA](ca: Option[A]): Option[_ <: Parent] = ca
所以,除非我误解 the spec :

If there exists a substitution σ over the type variables a_i,…,a_n such that σT conforms to pt, one determines the weakest subtype constraints C1 over the type variables a1,…,an such that C0 ∧ C1 implies that T conforms to [the expected type] pt.


, pt将是 Option[_ <: Parent] ,然后 a1,...,an将是单一合成类型 _$2 ,以及约束 _$2 >: Nothing <: ChildA应该使类型 Option[_$2]符合 Option[_ <: Parent] .所以,它似乎应该工作,但没有。

奖金
如果你只是想让它工作,那么只需跳过所有这些通配符,它​​们是不需要的:
trait Parent
class ChildA extends Parent
class ChildB extends Parent

def whatIsInside(opt: Option[Parent]): String = {
opt match {
case Some(_: ChildA) => "ChildA"
case Some(_: ChildB) => "ChildB"
case None => "None"
case _ => throw new Error("meh")
}
}


whatIsInside(Some(new ChildA))
whatIsInside(Some(new ChildB))
whatIsInside(None)

关于Scala 编译错误 : not found: type _$1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67651784/

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