Ваша подпись неверна:
deleteDuplicates :: [a] -> [a]
Это говорит о том, что ваша функция может работать со списками любого типа, a
, но это не так!Позже вы звоните:
x == (head xs)
Таким образом, вы должны быть в состоянии сравнить ваш тип на равенство.Значение подписи должно быть следующим:
deleteDuplicates :: Eq a => [a] -> [a]
В такие моменты полезно удалить явную сигнатуру типа, загрузить функцию в GHCi и определить, какой тип интерпретатор считает необходимым (через :t deleteDuplicates
).
Больше ошибок
Кроме того, использование head
является плохой идеей.head
является частичной функцией и завершится ошибкой, когда xs == []
.Я предлагаю вам расширить соответствие шаблону:
deleteDuplicates (x1:x2:xs)
| x1 == x2 = ...
| otherwise = x1 : deleteDuplicates (x2:xs)
Также обратите внимание на исправление в случае otherwise
.Вы пропустили x2, но что, если x2 соответствует следующему элементу в списке?Что-то вроде [1,2,2,3]
обнаружило бы 1 /= 2
, и тогда рекурсия получила бы список [2,3]
- упс!