gpt4 book ai didi

scala - 为什么我会在 scala 比赛中遇到不可能的情况?

转载 作者:行者123 更新时间:2023-12-04 20:08:30 24 4
gpt4 key购买 nike

在下面的示例中,在第二个 case 中我希望与第一个 case 中的编译错误相同,但它编译。为什么?

object CaseMatching extends App {

case class Id(value: Long)
object Id { val zero = Id(0) }
case class Name(value: String)
case class IdName(id: Id, name: Name)

IdName(Id(0), Name("A")) match {
case IdName(_, Id(0) ) => // does not compile (as expected)
case IdName(_, Id.zero) => // does compile (but should not ?)
case IdName(Id.zero, _) => println("OK") // this is OK and will match
case _ =>
}

}

为什么是相关的? - 我花了一个小时的大部分时间才找出为什么从未遇到过以下案例: case TreeEntry(_, Some(child), _, _, NodeType.DIR, _, _)那是因为 NodeType 位于第 4 个字段而不是第 5 个字段。如果编译器告诉我,我会很感激的!

最佳答案

最短的答案:使 Name 最终足以说服编译器 zero 不是一个。请参阅 this issue 和环境。

它会在类型测试时发出警告,这是一个 isInstanceOf:

<console>:15: warning: fruitless type test: a value of type CaseMatching.Name cannot also be a CaseMatching.Id
case IdName(_, _: Id) =>
^

但不是在测试平等时,因为平等是普遍的。

这是另一个很好的, case IdName(_, Id) =>
<console>:15: error: pattern type is incompatible with expected type;
found : CaseMatching.Id.type
required: CaseMatching.Name
Note: if you intended to match against the class, try `case _: Id`
case IdName(_, Id) =>
^

你想要的是:
scala> IdName(Id(0), Name("A")) match { case IdName(_, id: Id.zero.type) => }
<console>:21: warning: fruitless type test: a value of type Name cannot also be a Id (the underlying of Id.zero.type)
IdName(Id(0), Name("A")) match { case IdName(_, id: Id.zero.type) => }
^

单例类型仅包含该值,因此它使用 eq 进行测试;作为型式测试,它还警告。 (截至本周,它使用 eq 而不是 equals。)

不确定这对你有多远,但是:
scala> :pa
// Entering paste mode (ctrl-D to finish)

sealed trait Id { def value: Long }
case class Nonzero(value: Long) extends Id
case object Zero extends Id { val value = 0L }
case class Name(value: String)
case class IdName(id: Id, name: Name)

// Exiting paste mode, now interpreting.

scala> IdName(Zero, Name("A")) match { case IdName(_, Zero) => 1 }
<console>:14: error: pattern type is incompatible with expected type;
found : Zero.type
required: Name
IdName(Zero, Name("A")) match { case IdName(_, Zero) => 1 }
^

关于scala - 为什么我会在 scala 比赛中遇到不可能的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966378/

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