在 Haskell 中计算列表中的回文时出现匹配类型错误

Match type error when counting palindromes in a list in Haskell

我得到的匹配类型 [Char]String -> Bool 错误:

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

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

countPalindromes 使用 isPalindrome 检查字符串是否为回文。

关于回文计数任务,我现在遇到的问题与 中的不同。第一个问题解决了,提示我开新问题解决新问题。这就是为什么这是一个不同的问题。

isPalindrome :: String -> Bool,也就是说它需要一个字符串,然后给你一个布尔值来说明该字符串是否是回文。

(==) :: Eq a => a -> a -> Bool,也就是说它期望类型类 Eq 的两个值(换句话说:任何可相等的值)并告诉您它们是否相等。

将它们配对,你会得到 (== isPalindrome) :: (String -> Bool) -> Bool*。您已经向 (==) 传递了一个 String -> Bool 值,因此它期望再得到一个值并会告诉您两者是否相等。不过,这并不是您想要的。您不是在比较两个函数....

事实上,您根本没有在比较任何两件事。当 isPalindrome 调用时,您只想查看哪些值传递给 countPalindromes return True。这就是 filter 的用途!

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

它正在寻找一个 a -> Bool 作为第一个参数传递。这个函数将决定什么通过过滤器,什么不通过,在这种情况下,您想要使用 isPalindrome 的一些推导。在这种情况下再次查看 isPalindrome 我们看到:

isPalindrome :: String -> Bool

看起来非常像 a -> Bool 函数!让我们尝试用 String.

替换 filter 类型签名中的所有 a
filter :: (String -> Bool) -> [String] -> [String]

这看起来正是您想要的!然后尝试使用 filter isPalindrome 而不是 filter (== isPalindrome).


* 吹毛求疵:函数(更一般地说:类型 (-> r) 的值)不是 Eq 类型类的成员,所以你实际上会得到一个错误,说你无法判断一个String -> Bool 等于另一个 String -> Bool。不过,这与问题 at-hand 无关,所以我假装这不是问题,并将此解释隐藏在这里。