Haskell:使用foldr的函数中的类型不匹配

Haskell:使用foldr的函数中的类型不匹配,haskell,Haskell,我不明白为什么这些函数中会出现错误: countEqualPairs:: Eq a => [a] -> Int countEqualPairs (s:ss) = foldr test s ss test :: Eq a => a -> a -> Int test s c = if (c == s) then 1 else 0 错误消息: 有谁能解释一下,我做错了什么 谢谢 foldr::(a->b->b->b->[a]->b上可以找到一个a->b->b形式的函数

我不明白为什么这些函数中会出现错误:

countEqualPairs:: Eq a => [a] -> Int
countEqualPairs (s:ss) = foldr test s ss

test :: Eq a => a -> a -> Int
test s c = if (c == s) then 1 else 0
错误消息:

有谁能解释一下,我做错了什么

谢谢

foldr::(a->b->b->b->[a]->b
上可以找到一个
a->b->b
形式的函数,但是您的
测试
函数看起来更像
a->a->b

如上所述,您函数的
b
甚至与累加器中的
b
不匹配,使用
:t foldr
时,可以从GHCi中检索信息(这可以针对任何函数)。您尝试做的其他选择可能是(如果我没有弄错,您可以尝试计算双打的数量):


非常感谢您的宝贵意见和回答。我是这样解决的:

countEqualPairs :: Eq a => [a] -> Int countEqualPairs ss = sum (zipWith test (init ss) (tail ss)) test :: Eq a => a -> a -> Int test c1 c2 = if (c1 == c2) then 1 else 0 

无需使用
hoogle
-只需在ghci中键入
:t foldr
)-而且
test
这里根本不适合(
b
与所用
foldr
中的
b
有很大不同)你完全正确,我的答案有点迷糊了(从编辑历史中可以看出),但是感谢您在
flip
@MrTsjolder中使用cleara,我不认为该函数会做您想做的事情(其中有更多错误)-该函数应该做什么?即使可以键入,您的最终结果也会是0或1,这可能不是你的目标。这是家庭作业(没有问题-没有悲伤)-但是如果你能解释函数应该做什么(你可以发布练习-我们看到你尝试了什么)-这会有所帮助-但是因为你是新来的-请编辑你的问题(大多数添加内容作为评论或答案)
countEqualPairs [] = 0
countEqualPairs (s:ss) = if (s `elem` ss) then 1 + x else x
                         where x = countEqualPairs ss
countEqualPairs :: Eq a => [a] -> Int countEqualPairs ss = sum (zipWith test (init ss) (tail ss)) test :: Eq a => a -> a -> Int test c1 c2 = if (c1 == c2) then 1 else 0