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

时间:2018-03-26 21:12:42

标签: string list haskell palindrome

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

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

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

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

我现在有一个与my first question关于此回文计数任务的问题不同。第一个问题已经解决,我被指示打开一个新问题来解决新问题。这就是为什么这是一个不同的问题。

1 个答案:

答案 0 :(得分: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类型1}}等于另一个String -> Bool。然而,这与手头的问题无关,所以我假装这不是一个问题,并将此解释埋没在这里。