2015-02-18 2 views
1

Я только начинаю проникать в мир функционального программирования в классе. В качестве части назначения нам необходимо написать функцию, которая определяет, является ли список одиночным или нет (если список имеет ровно один элемент внутри него)Haskell «Нет экземпляра для (Eq a), возникающего из-за использования`/= '"

Я написал функцию, и она отлично работает :

singleton x = x /= [] && x == take 1 (x) 

Если я вызываю singleton [1], он возвращает true, как ожидалось. Если я вызываю singleton [] или singleton [1,2,3], он возвращает false, как ожидалось.

Однако, мой профессор хочет, чтобы должным образом документировать код с (я не совсем уверен, что это называется, но это говорит Haskell, чего ожидать, как вход и выход из функции):

singleton :: [a] -> Bool 

Насколько я могу судить, это должно сработать, но как только у меня получится, компилятор говорит: «Нет примера для (Eq a), возникающего из-за использования«/= »

Может ли кто-нибудь указать мне в правильном направлении получить код, скомпилированный с этим (я действительно не знаю, что это называется) бит объявления функции?

Спасибо!

+1

Возможный дубликат [Haskell: Нет экземпляра для (Eq a), возникающего из-за использования \ '== '] (http://stackoverflow.com/questions/16154592/haskell-no-instance-for-eq- a-возникающий из-за-использования) – Mephy

+1

Я не думаю, что это то же самое, потому что в этом другом вопросе функция действительно * нуждается в 'Eq a', в то время как в этом ее можно переписать, чтобы избежать ее , –

+0

@ ØrjanJohansen Я думаю, что это то же самое. Ваша функция тоже нуждается в этом. Когда вы проверяете, является ли [a] == [a], подразумевается проверка равенства a. – piojo

ответ

7

В коде:

singleton x = x /= [] && x == take 1 (x) 

вы делаете тест на равенство, x == take 1 x. Это сопоставляет все элементы в списке, чтобы убедиться, что они равны, поэтому ваши элементы должны быть «сопоставимы». Вот что такое Eq a. Ниже приведено исправление вашей проблемы:

singleton :: (Eq a) => [a] -> Bool 
singleton x = x /= [] && x == take 1 (x) 

Но это, вероятно, не то, что вы хотите, так как тогда ваши типы должны быть сопоставимы. Вы должны быть в состоянии проверить, является ли список одноэлементным, не сравнивая элементы. Но это упражнение для вас. Подсказка: он включает в себя сопоставление образцов.

Смежные вопросы