我收到的匹配类型[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关于此回文计数任务的问题不同。第一个问题已经解决,我被指示打开一个新问题来解决新问题。这就是为什么这是一个不同的问题。
答案 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
。然而,这与手头的问题无关,所以我假装这不是一个问题,并将此解释埋没在这里。