如何在Haskell中正确使用foldr?

如何在Haskell中正确使用foldr?,haskell,fold,Haskell,Fold,我正在尝试编写一个函数,其行为如下: correctCards :: [Card] -> [Card] -> Int 它需要两张卡片类型列表,并检查有多少张卡片是相同的。这是我的密码: correctCards answer guess = foldr step acc guess where acc = 0 step acc guess | elem (head guess) ans

我正在尝试编写一个函数,其行为如下:

correctCards :: [Card] -> [Card] -> Int
它需要两张卡片类型列表,并检查有多少张卡片是相同的。这是我的密码:

correctCards answer guess = foldr step acc guess
        where 
            acc = 0
            step acc guess
                | elem (head guess) answer  = acc + 1
                | otherwise                 = acc

但类型不匹配。有人能告诉我哪里出了问题吗?谢谢。

看看
foldr
的类型:

foldr :: (a -> b -> b) -> b -> [a] -> b
现在,这意味着您提供的函数必须是
a->b->b
类型。给定以下代码:

foldr step 0 cards
-- cards :: [Card]
-- 0     :: Integer
-- step  :: ???
步骤的类型应该是什么?根据我们的参数,
a
应该是
Card
b
应该是
Integer

-- concrete type of `foldr` in this case
foldr :: (Card -> Integer -> Integer) -> Integer -> [Card] -> Integer
因此,
步骤
的类型应为
(卡片->整数->整数)
。将其与step函数进行比较:

step acc guess
    | elem (head guess) answer  = acc + 1
    | otherwise                 = acc
在这种情况下,
step
Integer->[Card]->Integer
。那不是正确的类型。相反,你想要

step guess acc
     | elem guess answer = acc + 1
     | otherwise         = acc

请注意,
step
只需要一个列表,而不是一个完整的列表。

给定两个列表
[a,K,Q]
[a,Q,J]
您希望返回
1
(因为只有第一个位置匹配)还是
2
(因为每个列表中都有
a
Q
)?
step 0 guess
应该是
step acc guess
真的。我会把它写成
correctCards=(长度:intersect)`on`numb
@user3928256我想它是
let(.:)=(。()
here@Paul你会在hayoo上找到它-它不是真正的标准操作符