如何在Haskell中正确使用foldr?

时间:2014-09-08 10:29:56

标签: haskell fold

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

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

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

1 个答案:

答案 0 :(得分:7)

查看foldr的类型:

foldr :: (a -> b -> b) -> b -> [a] -> b

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

foldr step 0 cards
-- cards :: [Card]
-- 0     :: Integer
-- step  :: ???

step的类型应该是什么?根据我们的论点,a应为Cardb应为Integer

-- concrete type of `foldr` in this case
foldr :: (Card -> Integer -> Integer) -> Integer -> [Card] -> Integer

因此,step应该具有(Card -> Integer -> Integer)类型。将此与您的步骤函数进行比较:

step acc guess
    | elem (head guess) answer  = acc + 1
    | otherwise                 = acc

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

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

请注意,step仅采用,而不是整个列表。