20
val x = for(i <- 1 to 3) yield i
x match {
    case 1 :: rest => ... // compile error
}

构造函数无法实例化为预期类型;找到:collection.immutable.::[B] 需要:scala.collection.immutable.IndexedSeq[Int]

当 match 收到 IndexedSeq 但不是 LinearSeq 时,这与MatchError 相同。

问题是,如何正确地做到这一点?到处添加.toList似乎不对。如果每个人都这样做,那么创建一个自己的提取器来处理每个Seq(如另一个问题的答案中所述)会导致一团糟......

我想问题是,为什么我不能影响序列理解的返回类型是什么,或者:为什么Seq标准库中没有这样一个通用提取器的一部分?

4

2 回答 2

35

好吧,您可以对任何序列进行模式匹配:

case Seq(a, b, rest @ _ *) =>

例如:

scala> def mtch(s: Seq[Int]) = s match { 
  |      case Seq(a, b, rest @ _ *) => println("Found " + a + " and " + b)
  |      case _ => println("Bah") 
  |    }
mtch: (s: Seq[Int])Unit

然后这将匹配任何超过(或等于)2个元素的序列

scala> mtch(List(1, 2, 3, 4))
Found 1 and 2

scala> mtch(Seq(1, 2, 3))
Found 1 and 2

scala> mtch(Vector(1, 2))
Found 1 and 2

scala> mtch(Vector(1))
Bah
于 2012-07-16T11:20:09.690 回答
0

REPL 中 Vector 的另一种解决方案:

Vector() match {
    case a +: as => "head + tail"
    case _       => "empty"  
}
 res0: String = "empty"

Vector(1,2) match {
  case a +: as => s"$a + $as"
  case _      => "empty"  }
res1: String = 1 + Vector(2)
于 2018-11-22T15:17:53.690 回答