#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. отлично, большое вам спасибо, моя программа теперь работает отлично.