Требуется стабильный идентификатор при сопоставлении с образцом? (Скала) - PullRequest
10 голосов
/ 26 июня 2011

Попытка создать список кортежей, показывающих кратность простого фактора ... идея состоит в том, чтобы сопоставить каждое целое число в отсортированном списке с первым значением в кортеже, используя второе значение для подсчета.Скорее всего, с 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 ]

14 голосов
/ 26 июня 2011

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

3 голосов
/ 26 июня 2011

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

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

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