Стабильный идентификатор, необходимый при сопоставлении шаблонов? (Scala)

Попытка создать список кортежей, показывающих множественность множественных факторов... идея состоит в том, чтобы сопоставить каждое целое число в отсортированном списке с первым значением в кортеже, используя второе значение для подсчета. Возможно, сделать это легче с помощью takeWhile, но meh. К сожалению, мое решение не будет компилироваться:

  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

Почему это и почему компилятор не справляется, если существует такое простое исправление?

Ответ 1

Переменная в шаблоне фиксирует значение в этой позиции; он не делает сравнения. Если синтаксис работал вообще, результатом было бы поставить значение a в b.head._1, перезаписав текущее значение. Цель этого - позволить вам использовать шаблон, чтобы вытащить что-то из сложной структуры.

Ответ 2

b.head._1 не является допустимым именем для результата (x, y) экстрактора кортежей

Попробуйте это вместо:

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