在 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 无关,所以我假装这不是问题,并将此解释隐藏在这里。
我得到的匹配类型 [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 无关,所以我假装这不是问题,并将此解释隐藏在这里。