Haskell - 用 foldr 计数

Haskell - counting with foldr

正在处理一个 Haskell 问题,对这门语言来说还很陌生。我正在尝试计算元组列表中存在的元组值的出现次数。

我的元组是这样的:[(5, [7,2]), (2,[5,7,1,6])]

到目前为止,使用 foldr,我已经这样做了:

testFunc = foldr (\x-> const succ) 0

但是,这只会检索元组左侧的计数。我有点困惑,如何解决这个问题?

-- 预期输出:6

-- 当前输出:2

foldr的类型是:

foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

这意味着它所调用的函数应该采用当前值和累加器,并将 return 一个与累加器类型相同的值。然后它为累加器取一个初始值,最后 Foldable 要迭代的东西。

累加器显然是计数,对于空列表,它将为零,因此这是我们的初始累加器值。

然后我们每次只需将列表的长度添加到该累加器。我们可以将这些数据进行模式匹配。我们将为每个元组中的第一项使用 _,因为我们不关心该值。

Prelude> testData = [(5, [7,2]), (2,[5,7,1,6])]
Prelude> foldr (\(_, lst) count -> count + length lst) 0 testData
6
Prelude>