Migliorare la mia inelegante funzione di deduplicazione Haskell

1

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?

    
posta TheEnvironmentalist 15.07.2018 - 13:26
fonte

1 risposta

3

Dato il primo elemento dell'elenco, vogliamo inserirlo nel risultato, rimuoverlo dal resto dell'elenco e quindi continuare la deduplicazione del resto. Questo ci dà il seguente codice corto:

dedup :: [a] -> [a]
dedup [] = []
dedup (x:xs) = x : dedup (filter (/= x) xs)
    
risposta data 15.07.2018 - 19:12
fonte

Leggi altre domande sui tag