2010-12-22 10 views
11

Sto studiando un codice scala e ho trovato questo metodo che mi sconcerta. Nell'estratto della partita, qual è il costrutto [email protected]? che tipo di valore contiene? quando lo stampo non è diverso da tail, ma se lo sostituisco con tail, la funzione restituisce il risultato diff. Qualcuno può spiegare di cosa si tratta e indirizzarmi verso una risorsa giusta per capirlo? (So ​​che posso cercare in google, ma non so che cosa cercare ..)Aiuto Scala "match"

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

'@' viene in genere utilizzato nelle annotazioni, ma non vedo nulla di simile qui ... –

risposta

28

Lo chiamerei "mangia la tua torta e fallo anche operatore". A qualsiasi livello nella corrispondenza dei pattern, puoi dare a una parte un nome (prima della @) e decostruirlo ulteriormente (dopo la @). Per esempio immaginate si desidera far corrispondere contro un elenco con 3 elementi, è necessario il secondo elemento, ma si desidera registrare l'intera lista:

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

Senza questa funzionalità, si doveva scrivere qualcosa di simile

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

Come potete vedere, dobbiamo nominare il primo e il terzo elemento, solo perché abbiamo bisogno di loro per ottenere una lista con la stessa struttura sul lato destro, che è il boilerplate. È molto più semplice e chiaro se è possibile dare un nome all'intero oggetto (list) e parti anche più profonde nella struttura (elem), quando è necessario entrambi sul lato destro.

+0

Fantastica spiegazione. Grazie uomo!! –

8

In questo caso, elenco secondario diviene una variabile denominata per l'intero elenco (_ :: tail). la coda è, beh, la coda della lista. Non sono sicuro che ci sia un nome proprio per "@" qui.

Non vedo lo scopo di sublimare qui, poiché è possibile fare riferimento direttamente a ls direttamente.

Disclaimer: Sono nuovo di scala. Spero di aver capito bene.

+1

È lo stesso in Haskell (e anche in ML). – delnan

+0

Ehi, grazie per la risposta. Entrambe le risposte mi hanno aiutato a capirlo. –

+10

Si chiama "pattern binder" nella lingua di riferimento. – Debilski