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>
正在处理一个 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>