Sto lavorando per l'apprendimento di Haskell, e uno degli esercizi più semplici che ho intrapreso a tal fine è scrivere una funzione che deduplica un elenco, rimuovendo tutti gli elementi duplicati di un elenco in modo tale che ogni elemento nell'elenco di output è sia unico che presente nell'elenco originale.
Il mio codice inelegante per fare ciò è il seguente:
dedup [] = []
dedup (n:ns) = theDedup n ns ns
where theDedup n ns remains
| ns == [] = n : []
| remains == [] = n : theDedup (head ns) (tail ns) (tail ns)
| n == head remains = theDedup (head ns) (tail ns) (tail ns)
| otherwise = theDedup n ns $ tail remains
Per ogni elemento dell'elenco originale n:ns
, theDedup
prende quell'elemento e lo confronta ricorsivamente a vicenda ( remains
), mantenendo una copia degli elementi lasciati a deduplicare come ns
. Quando remains
è scaduto, il n
attuale è stato confrontato con ogni altro valore e quindi deve essere univoco e quando ns
è scaduto, l'intero elenco è stato deduplicato, quindi n
deve essere univoco.
Questo è un modo piuttosto confuso di esprimere un algoritmo piuttosto semplice. Come può essere fatto meglio?