【发布时间】:2012-12-06 10:31:44
【问题描述】:
如何对列表中同一位置的元素求和? 例如:
[[2,3,4],[5,6,7],[8,9,10]]=[15,18,21]
谢谢
【问题讨论】:
标签: list haskell nested sum fold
如何对列表中同一位置的元素求和? 例如:
[[2,3,4],[5,6,7],[8,9,10]]=[15,18,21]
谢谢
【问题讨论】:
标签: list haskell nested sum fold
试试:
sumIn :: Num a => [[a]] -> [a]
sumIn = foldl (zipWith (+)) (repeat 0)
请注意,如果参数是一个空列表,则结果是一个无限的零列表。所以你可能想单独处理这种情况,例如
sumIn :: Num a => [[a]] -> [a]
sumIn [] = []
sumIn xs = foldl (zipWith (+)) (repeat 0) xs
【讨论】:
这是 GHCi 中的一个示例:
λ> let xs = [[2,3,4],[5,6,7],[8,9,10]]
λ> foldr1 (zipWith (+)) xs
[15,18,21]
【讨论】:
f x = if even x then 0 else 1,然后在上面的结果中定义map f。所以map f [15,18,21] 会给你[1,0,1]。这就是你想要的吗?
您可以转置列表,并对结果中的每个列表求和:
ghci> import Data.List (transpose)
ghci> map sum $ transpose [[2,3,4],[5,6,7],[8,9,10]]
[15,18,21]
与其他解决方案不同,这适用于长度不均匀的列表。
【讨论】: