如何在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上找到它-它不是真正的标准操作符