Ошибка типа соответствия при подсчете палиндромов в списке в Haskell

Я получаю тип совпадения [Char] с String -> Bool ошибка:

isPalindrome :: String -> Bool
isPalindrome w = w == reverse w

countPalindromes :: [String] -> Int
countPalindromes ss = length (filter (== isPalindrome) ss)

countPalindromes использования isPalindrome проверить, является ли строка палиндромом.

Теперь у меня другая проблема, чем в моем первом вопросе об этой задаче подсчета палиндрома. Первая проблема была решена, и мне было поручено открыть новый вопрос для решения новой проблемы. Вот почему это другой вопрос.

1 ответ

Решение

isPalindrome :: String -> Bool, то есть он ожидает строку, а затем дает логическое значение, чтобы сказать, является ли эта строка палиндромом.

(==) :: Eq a => a -> a -> Boolэто означает, что он ожидает два значения класса типов Eq (другими словами: что-нибудь уравновешенное) и говорит вам, равны ли они.

Соедините их вместе, и вы получите (== isPalindrome) :: (String -> Bool) -> Bool*. Вы передали (==) String -> Bool значение, поэтому он ожидает еще один и скажет вам, если оба равны. Это не совсем то, что вы хотите. Вы не сравниваете две функции....

На самом деле, вы не сравниваете какие-либо две вещи вообще. Вы только хотите увидеть, какие значения переданы countPalindromes вернуть True когда вызывается isPalindrome, Это то что filter для!

filter :: (a -> Bool) -> [a] -> [a]

Это ищет a -> Bool передать в качестве первого аргумента. Это функция, которая будет решать, что проходит через фильтр, а что нет, и в этом случае вы хотите использовать некоторую деривацию isPalindrome, Снова глядя на isPalindrome в этом контексте мы видим:

isPalindrome :: String -> Bool

это выглядит очень похоже на a -> Bool функция! Давайте попробуем заменить все aв filterТип подписи с String,

filter :: (String -> Bool) -> [String] -> [String]

Похоже, это именно то, что вы хотите! Попробуйте, затем, используя filter isPalindrome вместо filter (== isPalindrome),


* nitpick: функции (в более общем смысле: значения типа (-> r)) не являются членами Eq класс типов, так что вы на самом деле получите ошибку о том, что вы не можете сказать, если String -> Bool равно другому String -> Bool, Это не относится к рассматриваемой проблеме, поэтому я притворяюсь, что это не проблема, и спрятал это объяснение здесь.

Другие вопросы по тегам