矩阵到单行的递归和列(带zipWith(+))

maj*_*Tom 0 recursion haskell matrix zipwith

lstsAdder :: [[Integer]] -> [Integer]
lstsAdder [] = []
lstsAdder (x:xs) = zipWith (+) x (lstsAdder xs)
Run Code Online (Sandbox Code Playgroud)

正如标题所说,我希望它以递归方式添加:[[a,b,c],[d,e,f]]就像这样:[a+d,b+e,c+f],以及任何有限长度的列表列表.但我所有的实现回报都是[].为什么会这样,我该如何解决?

Cla*_*ude 5

您的递归基本案例返回[],和length (zipWith f a b) = min (length a) (length b).这意味着您的结果将始终具有长度0.标识元素为minis + infinity,标识元素为(+)is 0,因此一个可能的基本情况是repeat 0.

您还可以看到数据的前置条件是否允许您执行类似的操作

import Data.List (transpose)
lstsAdder = map sum . transpose
Run Code Online (Sandbox Code Playgroud)

它有不同的边缘情况下的行为(QuickCheck给出[[0,0],[0]]的一个例子输入),但也许那些边缘的情况下也不会在实践中发生的你.