总结一份清单?

时间:2012-03-02 18:35:38

标签: haskell

如何将列表列表与?

相加

我知道我可以将两个列表总结为:

zipWith (+) [1,2,3] [2,3,4]

但列表清单怎么样?例如:

let k = [ [1,1,1], [2,2,2], [3,3,3] ]
sumFoo k
> [ 6, 6, 6]

我尝试过类似的事情:

foldr (\xs ys -> zipWith (+) xs ys) [] k

但这给了我一个空列表!

编辑:抱歉,我选了一个不好的例子!它应该总结不同列表的相同指标。查看更新的示例。

3 个答案:

答案 0 :(得分:5)

回答OP问题:

foldl1 (zipWith (+)) k

应该做的伎俩。 Foldl1以列表的第一个元素作为累加器值开始,这就是你想要的。

如果您愿意,还可以使用zipWith3,zipWith4,....一直到7个。

-----------找到总和------

首先要对列表中的每个元素(即每个嵌套列表)进行求和,然后对结果运行求和。

所以:

sum . map sum $ k

就是这样!

如果您不熟悉,请注意。或$ syntax - $是函数应用程序,但是是正确关联的(保存括号),和。是功能组合。

答案 1 :(得分:4)

编辑:现在更清楚你真正需要的是什么:)你有一个矩阵表示为列表列表,并希望提取列总和。为此,只需转置矩阵并计算行总和:

Prelude> import Data.List
Prelude Data.List> map sum . transpose $ [ [1,1,1], [2,2,2], [3,3,3] ]
[6,6,6]

答案 2 :(得分:3)

我认为你真正想要的是:

import Data.List

positionalSums :: Num a => [[a]] -> [a]
positionalSums = map sum . transpose

加载到ghci时:

> positionalSums [ [1,2,3], [2,3,4], [3,4,5] ]
[6,9,12]
> positionalSums [ [1,2,3], [2,3,104], [3,4,5] ]
[6,9,112]

transpose是这里有趣的功能。这是使整个事情发挥作用的原因。如果您将列表列表视为二维布局,它基本上会交换行和列。

这里的关键实现是你想要获取每个输入列表的第一个元素,第二个元素,第三个元素的总和......最简单的方法是重新排列列表的输入列表,以便要添加到一起的每组元素都在一起。这就是转置的作用。