Функция isPalindrome в Haskell выдает ошибку - PullRequest
3 голосов
/ 06 октября 2019

Я пытался написать программу, которая проверяет, является ли список палиндромом, и возвращает Bool.

isPalindrome :: [a] -> Bool
isPalindrome [] = True
isPalindrome [x] = True
isPalindrome xs | (head xs) == (last xs) = isPalindrome (init(tail xs))
                | otherwise = False

И я получил сообщение об ошибке, подобное этому:

problem6.hs:4:19: error:
    * No instance for (Eq a) arising from a use of `=='
      Possible fix:
        add (Eq a) to the context of
          the type signature for:
            isPalindrome :: forall a. [a] -> Bool
    * In the expression: (head xs) == (last xs)
      In a stmt of a pattern guard for
                     an equation for `isPalindrome':
        (head xs) == (last xs)
      In an equation for `isPalindrome':
          isPalindrome xs
            | (head xs) == (last xs) = isPalindrome (init (tail xs))
            | otherwise = False
  |
4 | isPalindrome xs | (head xs) == (last xs) = isPalindrome (init(tail xs))
  |                   ^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.

Потому что яЯ не очень опытный, я ничего не понимаю из сообщения об ошибке. Так что я не вижу, где ошибка в моем коде. Спасибо за помощь.

1 Ответ

5 голосов
/ 06 октября 2019

Проблема в том, что вам нужно ограничить полиморфный тип 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

Материал перед => в моем предложении называется контекстом, и именно здесь вы можете добавить ограничения для ваших типов. Предлагаемое здесь предложение говорит вам сделать именно то, что я сказал выше (хотя и более многословно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...