val x = for(i <- 1 to 3) yield i
x match {
case 1 :: rest => ... // compile error
}
构造函数无法实例化为期望的类型;发现: collection.immutable.:: [B]必填: scala.collection.immutable.IndexedSeq [INT]
这与MatchError when match receives an IndexedSeq but not a LinearSeq相同。
问题是,怎么做对了?在任何地方添加.toList
似乎都不正确。并且创建一个自己的提取器来处理每个Seq
(如另一个问题的答案中所述)如果每个人都这样做会导致混乱......
我想问题是,为什么我不能影响序列理解的返回类型,或者:为什么不是标准库中这样的通用Seq
提取器部分?< / p>
答案 0 :(得分: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
答案 1 :(得分: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)