Проблема в том, что вам нужно ограничить полиморфный тип a
. В данный момент у компилятора нет информации о типе, поэтому он даже не может знать, определен ли (==)
для a
(отсюда и No instance for (Eq a) arising from a use of ``=='
. Он пытается вывести экземпляр Eq
для a
, но это невозможно. Вам нужно помочь с этим).
Вы должны сделать тип:
isPalindrome :: (Eq a) => [a] -> Bool
Теперь вы говорите, что isPalindrome
можно дать только списки вещей, которые являются экземплярами Eq
.
Это указывает на этот кусок, потому что вы пытаетесь сравнить два a
на равенство:
(head xs) == (last xs)
Немного о сообщении об ошибке:
Possible fix:
add (Eq a) to the context of
the type signature for:
isPalindrome :: forall a. [a] -> Bool
Материал перед =>
в моем предложении называется контекстом, и именно здесь вы можете добавить ограничения для ваших типов. Предлагаемое здесь предложение говорит вам сделать именно то, что я сказал выше (хотя и более многословно).