模式匹配期间需要稳定的标识符? (斯卡拉)

时间:2011-06-26 13:36:55

标签: scala pattern-matching

尝试生成显示素因子多重性的元组列表...这个想法是将排序列表中的每个整数与元组中的第一个值匹配,使用第二个值进行计数。可能用takeWhile可以更容易地做到这一点,但是。不幸的是我的解决方案无法编译:

  def primeFactorMultiplicity (primeFactors: List[Int]) = {

    primeFactors.foldRight (List[(Int, Int)]()) ((a, b) => (a, b) match {
      case (_, Nil)       => (a, 1) :: b
      case (b.head._1, _) => (a, b.head._2 + 1) :: b.tail
      case _              => (a, 1) :: b
    })
  }

它说“错误:需要稳定的标识符,但发现了b.head._1”。但是将第二个case行更改为以下内容可以正常工作:

      case (i, _) if (i == b.head._1) => (a, b.head._2 + 1) :: b.tail

为什么会这样,为什么编译器无法应对这种简单的修复?

2 个答案:

答案 0 :(得分:14)

模式中的变量捕获该位置的值;它进行比较。如果语法完全有效,则结果是将a的值放入b.head._1,覆盖当前值。这样做的目的是让你使用一种模式从复杂的结构中拉出一些东西。

答案 1 :(得分:3)

b.head._1不是(x, y)元组提取器结果的有效名称

请改为尝试:

case (x, _) if x == b.head._1 => (a, b.head._2 + 1) :: b.tail