Ошибка типа соответствия при подсчете палиндромов в списке в 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
, Это не относится к рассматриваемой проблеме, поэтому я притворяюсь, что это не проблема, и спрятал это объяснение здесь.