我正在尝试编写一个行为如下的函数:
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
但是类型不匹配。谁能告诉我哪里出错了?感谢。
答案 0 :(得分:7)
查看foldr
的类型:
foldr :: (a -> b -> b) -> b -> [a] -> b
现在,这意味着您提供的功能必须是a -> b -> b
类型。给出以下代码:
foldr step 0 cards
-- cards :: [Card]
-- 0 :: Integer
-- step :: ???
step
的类型应该是什么?根据我们的论点,a
应为Card
而b
应为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
在这种情况下,step
为Integer -> [Card] -> Integer
。那不是正确的类型。相反,你想要
step guess acc
| elem guess answer = acc + 1
| otherwise = acc
请注意,step
仅采用单,而不是整个列表。