2009-10-24 20 views
7

Nuovo per Haskell e avere un ostacolo. Sto provando a filtrare un elenco di tuple in base al primo elemento.Elenco filtri di tuple

filter (==(x,_)) lis 

Viene visualizzato un errore "_" non valido, ma non sono sicuro di come aggirarlo?

risposta

19

In Haskell, non è possibile iterare su una tupla come se fosse una lista.

Se la tupla ha solo due elementi, è possibile utilizzare fst per recuperare il primo elemento della tupla e snd per recuperare il secondo elemento.

Un modo per fare ciò che penso che si vuole fare è questo approccio:

Prelude> let lst = [(1,2), (3,4)] 
Prelude> filter ((==1).fst) lst 
[(1,2)] 

che restituisce solo gli elementi della lista in cui il primo elemento è uguale a 1; Naturalmente, è possibile sostituire x dove ho messo 1.

Per essere un po 'più specifico, (==1).fst prima applica fst all'elemento a LST, quindi applica (==1) al risultato di fst - tecnicamente, il punto compone le due funzioni insieme.

+0

Che bello, grazie. Mi stavo chiedendo cosa stessero facendo quelle su tutto il codice di esempio! – Zippy

+0

Penso che gli usi di (e le differenze tra) '.' e' $' siano uno degli ostacoli più comuni all'inizio di Haskell - quindi non preoccuparti, non sei l'unico ad aver avuto problemi con esso! –

5

Non è possibile fornire un argomento con un carattere jolly _ all'operatore == (o qualsiasi altra funzione). L'argomento deve essere un valore reale, non un modello che deve essere confrontato.

Se si desidera utilizzare pattern matching è possibile utilizzare una funzione lambda, come si filter condizione:

filter (\(a,_) -> a == x) lis 

Inoltre, v'è la funzione predefinita fst per estrarre il primo elemento di una tupla di due elementi. Questo può essere combinato con == per fare lo stesso test:

filter ((== x) . fst)) lis 
Problemi correlati