2010-12-22 9 views
11

Estoy estudiando algunos códigos scala y encontré este método que me desconcierta. En la declaración de coincidencia, ¿cuál es la construcción [email protected]? ¿Qué tipo de valor contiene? cuando lo imprimí no es diferente de tail, pero si lo reemplazo con cola, la función devuelve el resultado del diff. ¿Puede alguien explicar de qué se trata y señalarme un recurso correcto para entenderlo? (Sé que puedo buscar en Google, pero no sé qué buscar ..)Scala "coincidencia" ayuda

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

'@' se usa generalmente en las anotaciones, pero no veo nada parecido aquí ... –

Respuesta

28

Lo llamaría el "come tu torta y tenlo también operador". En cualquier nivel en la coincidencia de patrones, puede darle a la parte un nombre (antes de la @) y deconstruirlo más (después de la @). Por ejemplo imagine que desea hacer coincidir con una lista con 3 elementos, se necesita el segundo elemento, pero desea registrar toda la lista:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 

Sin esta característica, se tenía que escribir algo como

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 

Como puede ver, debemos nombrar el primer y el tercer elemento, simplemente porque los necesitamos para obtener una lista con la misma estructura en el lado derecho, que es un texto repetitivo. Es mucho más fácil y más claro si puede darle un nombre a todo (list), y partes más profundas en la estructura también (elem), cuando necesita ambas en el lado derecho.

+0

Explicación impresionante. ¡¡Gracias hombre!! –

8

En este caso, lista secundaria se convierte en una variable llamada para toda la lista (_ :: tail). la cola es, bueno, la cola de la lista. No estoy seguro de si hay un nombre propio para '@' aquí.

Realmente no veo el propósito de la sublista aquí, ya que solo puede hacer referencia ls directamente.

Descargo de responsabilidad: Estoy nuevo en scala. Espero haber conseguido esto bien.

+1

Es lo mismo en Haskell (y también en ML). – delnan

+0

Oye, gracias por la respuesta. Ambas respuestas me ayudaron a entenderlo. –

+10

Se llama 'carpeta de patrones' en la referencia del lenguaje. – Debilski

Cuestiones relacionadas