2011-06-26 9 views
10

Tratando de producir una lista de tuplas que muestren la multiplicidad de factores primos ... la idea es hacer coincidir cada entero en una lista ordenada con el primer valor en una tupla, usando el segundo valor para contar. Probablemente podría hacerlo más fácilmente con takeWhile, pero meh. Por desgracia mi solución no compilará:¿Se requiere un identificador estable durante la coincidencia de patrones? (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 
    }) 
    } 

Se dice "error: Identificador de estabilidad que requiere, pero b.head._1 encontró." Pero el cambio de la segunda línea case a la siguiente funciona bien:

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

¿Por qué es esto, y por qué no puede hacer frente al compilador si hay una solución tan simple?

Respuesta

14

Una variable en un patrón captura el valor en esa posición; hace no hacer una comparación. Si la sintaxis funcionó, el resultado sería poner el valor de a en b.head._1, sobrescribiendo el valor actual. El propósito de esto es permitirle usar un patrón para extraer algo de una estructura compleja.

+0

Cheers, parece que no entendía cómo funcionaba la coincidencia de patrones. Probablemente debería leer un libro en Scala uno de estos días. –

+0

@Luigi: le sugiero que empiece desde aquí http://www.artima.com/pins1ed/;) –

3

b.head._1 no es un nombre válido para el resultado del extractor (x, y) tupla

Tal vez puedas probar:

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