2011-06-26 16 views
10

Próba utworzenia listy krotek pokazujących krotność współczynnika prime ... chodzi o dopasowanie każdej liczby całkowitej do posortowanej listy z pierwszą wartością w krotce, z wykorzystaniem drugiej wartości do zliczenia. Prawdopodobnie może to zrobić łatwiej z takeWhile, ale meh. Niestety moje rozwiązanie się nie skompiluje:Stabilny identyfikator wymagany podczas dopasowywania wzorca? (Scala)

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 
    }) 
    } 

Mówi "błąd: wymagany jest stabilny identyfikator, ale znaleziono b.head._1". Ale zmieniając drugą linię case do następujących działa dobrze:

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

Dlaczego to jest i dlaczego nie może sobie poradzić, jeśli kompilator nie jest taki prosty fix?

Odpowiedz

14

Zmienna we wzorcu przechwytuje wartość w tej pozycji; to robi nie zrobić porównania. Jeśli składnia działałaby w ogóle, wynikiem byłoby umieszczenie wartości a na b.head._1, nadpisując bieżącą wartość. Ma to na celu umożliwienie użycia wzoru do wyciągnięcia czegoś ze złożonej struktury.

+0

Cheers, wygląda na to, że nie rozumiem, jak pasujące do wzorca pracował. Prawdopodobnie przeczytałbym książkę o Scali jednego z tych dni. –

+0

@Luigi: Proponuję zacząć tutaj http://www.artima.com/pins1ed/;) –

3

b.head._1 nie jest poprawną nazwą dla wyniku ekstraktora (x, y) krotki

Spróbuj to zamiast:

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