Я новичок в Haskell. Я написал этот код:Не удалось вывести (Eq a) из контекста (...)
deleteDuplicates :: [a] -> [a]
deleteDuplicates [] = []
deleteDuplicates (x:xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
Что означает эта ошибка и почему это произошло? Я случайно сравниваю два разных типа?
set2.hs:10:3:
Could not deduce (Eq a) from the context()
arising from a use of `==' at set2.hs:10:3-16
Possible fix:
add (Eq a) to the context of
the type signature for `deleteDuplicates'
In the expression: x == (head xs)
In a stmt of a pattern guard for
the definition of `deleteDuplicates':
x == (head xs)
In the definition of `deleteDuplicates':
deleteDuplicates (x : xs)
| x == (head xs) = x : (deleteDuplicates (tail xs))
| otherwise = x : (head xs) : (deleteDuplicates (tail xs))
Вы совершенно правы в чем-то вроде '[1, 2, 2, 3]', не получив список со всеми удаленными дубликатами. Виноват. Элемент 'Eq a =>' для меня является новым ... так что единственное, что делает, это принуждение к тому, чтобы элементы типа 'a' были сопоставимы? – Pieter
Pieter: В принципе, да. Это «ограничение типа стека». Функция '==' объявляется в 'Eq' typeclass, поэтому ее можно использовать только в экземплярах Eq. –
@ Питер: сопоставим для равенства, да. 'Eq a =>' говорит, что 'a' должен быть экземпляром класса type' Eq'. Класс type указывает интерфейс, который реализует экземпляр.Класс 'Eq' предоставляет две функции:' (==) 'и' (/ =) ', как с типом' a -> a -> Bool'. Другие типы классов будут предоставлять другие функции, например, 'Ord' предоставляет тесты менее, чем и более, и аналогичные. –