gpt4 book ai didi

haskell - 如何在Haskell中正确使用foldr?

转载 作者:行者123 更新时间:2023-12-02 04:07:31 24 4
gpt4 key购买 nike

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

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 :: ???

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 仅采用单个,而不是整个列表。

关于haskell - 如何在Haskell中正确使用foldr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25722198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com