我正在尝试编写一个行为如下的函数:
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)
但类型不匹配.谁能告诉我哪里出错了?谢谢.
看看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)
在这种情况下step是Integer -> [Card] -> Integer.那不是正确的类型.相反,你想要
step guess acc
| elem guess answer = acc + 1
| otherwise = acc
Run Code Online (Sandbox Code Playgroud)
请注意,step只需要一个单一的,而不是整个列表.