【问题标题】:Haskell - sum a list of lists using foldr/foldlHaskell - 使用 foldr/foldl 汇总列表列表
【发布时间】:2013-12-18 21:57:50
【问题描述】:

我正在尝试编写函数来汇总列表列表(类型Integer)。我已经使用map 完成了它:

summat :: [[Integer]] -> Integer
summat (x:xs) = sum . map sum $ (x:xs)

但不知道如何使用foldr/foldl 使其工作。我试过类似的东西:

summat2 :: [[Integer]] -> Integer
summat2 xs = foldr suma 0 xs
        where suma x _ = ???

但当然它只会产生很多错误。你对我有什么暗示吗?可能是concat

【问题讨论】:

  • 您当然可以使用concat,然后再使用折叠进行求和,老实说,我就是这样做的。 concat 是一个惰性函数,因此您仍然可以轻松获得良好的性能
  • 好吧,从x 的类型开始?然后你就会知道如何使用foldr

标签: list haskell


【解决方案1】:

如果你想避免作用于集合的多个元素的任何其他函数,试试这个

foldr ((+) . foldr (+) 0) 0

这只是使用 (+)、foldr 和 (.)。

【讨论】:

  • 我认为foldl'foldr 更受欢迎。
  • 好吧,我用 foldl 写的:summat3 :: [[Integer]] -> Integer summat3 (x:xs) = foldl (+) 0 (map sum (x:xs)) 如何以 jamshidh 使用的形式获得它?
  • 只需添加一个翻转-foldl (flip $ (+) . foldl (+) 0) 0
猜你喜欢
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多