С трудом понимаю, как использовать nubBy

#haskell

#haskell

Вопрос:

У меня проблема, когда мне приходится манипулировать списком из списка с плавающей точкой. [[Float]]. этот список с плавающими значениями имеет длину 4. Я хочу удалить дубликаты, в которых тестируются первые 3 элемента, но игнорировать 4-й. Это последняя часть проблемы, состоящей из нескольких частей, и я некоторое время бился головой о стену, выясняя, как это использовать. Я не могу найти никакой полезной информации.

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

Комментарии:

1. Из комментария к теме: Если 4-е число является особенным, возможно, вам следует как-то конкретизировать его при определении типов данных? Вроде того, как можно было бы использовать структуру со значимыми именами для хранения записи вместо использования массива значений.

2. типы данных предопределены, и я должен работать с тем, что мне дано

3. Тогда вы могли бы создать функцию преобразования 😉

Ответ №1:

nubBy принимает функцию для сравнения элементов на равенство. Ваше определение равенства заключается в том, что два списка равны, если их первые три элемента совпадают. Простая реализация этого:

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

Комментарии:

1. Можно было бы отказаться от повторения и стать nubBy ((==) `on` take 3) с дополнительным импортом Data.Function .

2. отлично, большое вам спасибо, моя программа теперь работает отлично.