如何将列表列表与?
相加我知道我可以将两个列表总结为:
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
但这给了我一个空列表!
编辑:抱歉,我选了一个不好的例子!它应该总结不同列表的相同指标。查看更新的示例。答案 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
是这里有趣的功能。这是使整个事情发挥作用的原因。如果您将列表列表视为二维布局,它基本上会交换行和列。
这里的关键实现是你想要获取每个输入列表的第一个元素,第二个元素,第三个元素的总和......最简单的方法是重新排列列表的输入列表,以便要添加到一起的每组元素都在一起。这就是转置的作用。