为什么此列表匹配器未按预期工作?

时间:2013-08-18 23:47:26

标签: scala

我正在练习使用提取器:

scala> object LE {
     | def unapply[A](theList: List[A]) = 
     | if (theList.size == 0) None
     | else Some((theList.head, theList.tail))
     | }
defined module LE

它适用于匹配一个元素:

scala> List(0, 1, 2) match {
     | case head LE more => println(head, more)
     | }
(0,List(1, 2))

但似乎不适用于匹配多个元素:

scala> List(0, 1, 2) match {
     | case head LE next LE more => println(head, more)
     | }
<console>:10: error: scrutinee is incompatible with pattern type;
 found   : List[A]
 required: Int

我的列表提取器看起来与Scala的Stream提取器非常相似,可以像这样使用:

val xs = 58 #:: 43 #:: 93 #:: Stream.empty
xs match {
  case first #:: second #:: _ => first - second
  case _ => -1
}

那么有什么区别可以阻止我的LE以这种方式使用?

1 个答案:

答案 0 :(得分:3)

问题是执行的顺序。对于#::,由于它以:结尾,因此Scala会对其进行特殊处理,从右到左而不是从左到右关联(对于任何其他运算符/类型,例如您的{{1}正常) })。以下按预期工作:

LE