如何在Haskell中正确使用foldr?

use*_*256 2 haskell fold

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

correctCards :: [Card] -> [Card] -> Int
Run Code Online (Sandbox Code Playgroud)

它需要两个类型卡列表并检查有多少卡是相同的.这是我的代码:

correctCards answer guess = foldr step acc guess
        where 
            acc = 0
            step acc guess
                | elem (head guess) answer  = acc + 1
                | otherwise                 = acc
Run Code Online (Sandbox Code Playgroud)

但类型不匹配.谁能告诉我哪里出错了?谢谢.

Zet*_*eta 7

看看foldr类型:

foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)

现在,这意味着您提供的功能必须是类型a -> b -> b.给出以下代码:

foldr step 0 cards
-- cards :: [Card]
-- 0     :: Integer
-- step  :: ???
Run Code Online (Sandbox Code Playgroud)

应该是什么类型的step?根据我们的论点,a应该Card并且b应该是Integer:

-- concrete type of `foldr` in this case
foldr :: (Card -> Integer -> Integer) -> Integer -> [Card] -> Integer
Run Code Online (Sandbox Code Playgroud)

因此,step应该有类型(Card -> Integer -> Integer).与此相比,您的阶跃函数:

step acc guess
    | elem (head guess) answer  = acc + 1
    | otherwise                 = acc
Run Code Online (Sandbox Code Playgroud)

在这种情况下stepInteger -> [Card] -> Integer.那不是正确的类型.相反,你想要

step guess acc
     | elem guess answer = acc + 1
     | otherwise         = acc
Run Code Online (Sandbox Code Playgroud)

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