gpt4 book ai didi

scala - 将类型匹配与序列匹配器混合会在 Scala 中产生奇怪的行为

转载 作者:行者123 更新时间:2023-12-04 16:00:31 25 4
gpt4 key购买 nike

我试图弄清楚这段代码发生了什么,试图弄清楚是否有我不理解的东西,或者它是否是编译器错误或不直观的规范,让我们定义这两个几乎相同的函数:

def typeErause1(a: Any) = a match {
case x: List[String] => "stringlists"
case _ => "uh?"
}
def typeErause2(a: Any) = a match {
case List(_, _) => "2lists"
case x: List[String] => "stringlists"
case _ => "uh?"
}

现在如果我打电话 typeErause1(List(2,5,6))我收到 "stringlists"因为即使它实际上是 List[Int]使用类型删除它无法区分。但奇怪的是,如果我调用 typeErause2(List(2,5,6))我收到 "uh?"我不明白为什么它不匹配 List[String]就像以前一样。如果我使用 List[_]相反,在第二个函数上,它能够正确匹配它,这让我认为这是 scalac 中的一个错误。

我正在使用 Scala 2.9.1

最佳答案

这是匹配器中的一个错误;) 模式匹配器正在(曾经?)rewritten 2.10

我刚刚检查了最新的每晚,您的代码按预期工作:

Welcome to Scala version 2.10.0-20120426-131046-b1aaf74775 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def typeErause1(a: Any) = a match {
| case x: List[String] => "stringlists"
| case _ => "uh?"
| }
warning: there were 2 unchecked warnings; re-run with -unchecked for details
typeErause1: (a: Any)String

scala> def typeErause2(a: Any) = a match {
| case List(_, _) => "2lists"
| case x: List[String] => "stringlists"
| case _ => "uh?"
| }
warning: there were 3 unchecked warnings; re-run with -unchecked for details
typeErause2: (a: Any)String

scala> typeErause1(List(2,5,6))
res0: String = stringlists

scala> typeErause2(List(2,5,6))
res1: String = stringlists

关于scala - 将类型匹配与序列匹配器混合会在 Scala 中产生奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10059774/

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