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

Lui*_*hys 10 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
    })
  }
Run Code Online (Sandbox Code Playgroud)

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

      case (i, _) if (i == b.head._1) => (a, b.head._2 + 1) :: b.tail
Run Code Online (Sandbox Code Playgroud)

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

gee*_*aur 14

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