2011-11-08 10 views
5

Ho un problema in cui devo manipolare un elenco di un elenco di float. [[Galleggiante]]. questa lista di float ha la lunghezza 4. Voglio rimuovere i duplicati in cui vengono testati i primi 3 elementi, ma ignori il 4 °. Questa è l'ultima parte di un problema in più parti e ho sbattuto la testa su un muro per un po 'per capire come usarlo. Non riesco a trovare alcuna informazione utile.Difficoltà a capire come usare nubBy

fixDuplicates :: [[Float]] -> [[Float]] 
fixDuplcates [[]] = [[]] 
fixDuplicates x = nubBy ? 
+2

Di topic: Se il 4 ° numero è speciale, forse dovresti reificarlo in qualche modo quando definisci i tipi di dati? Un po 'come si userebbe una struct con nomi significativi per memorizzare un record invece di usare una matrice di valori. – hugomg

+0

i tipi di dati sono predefiniti e devo lavorare con ciò che è dato –

+0

Quindi potresti creare una funzione di conversione;) – hugomg

risposta

10

nubBy prende una funzione da utilizzare per gli elementi di uguaglianza confronto. La tua definizione di uguaglianza è che due liste sono uguali se i loro primi tre elementi corrispondono. Un'implementazione semplice di questo è:

fixDuplicates xs = nubBy firstThreeMatch xs 
    where firstThreeMatch ys zs = take 3 ys == take 3 zs 
+8

Potrebbe abbandonare la ripetizione e diventare 'nubBy ((==) \' on \ 'prendere 3) 'con un ulteriore importazione di 'Data.Function'. – ephemient

+0

perfetto, grazie mille, il mio programma funziona perfettamente ora. –

Problemi correlati