2011-11-08 11 views
5

Tengo un problema donde tengo que manipular una lista de flotantes. [[Flotador]]. esta lista de flotadores es de longitud 4. Quiero eliminar duplicados donde se prueban los primeros 3 elementos, pero ignore el 4to. Esta es la última parte de un problema de varias partes y he estado golpeando mi cabeza en una pared por un tiempo tratando de entender cómo usar esto. No puedo encontrar ninguna información útil.Tener dificultades para entender cómo usar nubBy

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

Del comentario del tema: Si el 4to número es especial, ¿quizás debería reificarlo de alguna manera al definir los tipos de datos? Tipo de cómo se usaría una estructura con nombres significativos para almacenar un registro en lugar de usar una matriz de valores. – hugomg

+0

los tipos de datos están predefinidos y tengo que trabajar con lo que se me da –

+0

Puede crear una función de conversión;) – hugomg

Respuesta

10

nubBy toma una función a utilizar para la comparación de elementos para la igualdad. Su definición de igualdad es que dos listas son iguales si sus primeros tres elementos coinciden. Una implementación directa de esto es:

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

Podría soltar la repetición y convertirse en 'nubBy ((==) \' en \ 'tomar 3)' con un adicional importación de 'Data.Function'. – ephemient

+0

perfecto, muchas gracias, mi programa funciona perfectamente ahora. –

Cuestiones relacionadas