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?
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?
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.
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
Che bello, grazie. Mi stavo chiedendo cosa stessero facendo quelle su tutto il codice di esempio! – Zippy
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! –