Определение наличия повторяющихся элементов в списке в Haskell - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь проверить списки на дубликаты, но когда я скомпилирую и введу

repeated [1,2,3,4] 

выводит True. Что не так?

belongs :: Eq a => a -> [a] -> Bool
belongs n [] = False
belongs n (x:xs) | n == x = True
                 | otherwise = belongs n xs

repeated :: [Integer] -> Bool
repeated [] = False
repeated (x:xs) | belongs x xs = True
                | otherwise = belongs (head xs) xs

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

«own (head xs) xs» проверяет, находится ли голова xs в пределах xs, что всегда будет истинным.

(За исключением случаев, когда xs пуст, в этом случае ваша программа аварийно завершится! "Head"частичная функция, вылетает с пустыми списками)

Это исправит это (как указано @ talex , но я также предлагаю сделать его более общим, нет необходимости специализировать его наЦелое число):

repeated :: Eq a => [a] -> Bool
repeated [] = False
repeated (x:xs) | belongs x xs = True
                | otherwise = repeated xs
3 голосов
/ 31 мая 2019

Вы хотите

repeated :: [Integer] -> Bool
repeated [] = False
repeated (x:xs) | belongs x xs = True
                | otherwise = repeated xs
...