在 haskell 中逐点添加两个列表

Adding two lists point by point in haskell

我目前正在尝试学习 haskell,但遇到了一个我遇到问题的示例问题。

问题是假设我们有表示数字的列表,例如数字 12 是 [2,1],148 是 [8,4,1],那么我们如何将这两个列表加在一起,就像它们一样是数字。我的直觉是我们携带数字,它们加起来超过 10,类似于对大数进行加法。

到目前为止我的代码是:

addLnat [x] [y] = rem  (x + y) 10 : (quot (x + y) 10) : []          
addLnat (x:xs) (y:ys) =  (rem  (x + y) 10) : w + head (addLnat xs ys)
                            where w = quot (x + y) 10

但是这不会编译,我真的不明白为什么对我来说这似乎是解决方案,例如:

如果我们从 [3,2,1] 和 [6,6,9] 开始。我们将 6 和 3 相加,商为 0,所以 9:0+ 并重复直到我们得到最终的情况。

关于为什么这不是 working/compiling 的任何想法?

(rem  (x + y) 10) : w + head (addLnat xs ys)

cons : 运算符需要在其右侧有一个列表。你可能是说

(rem  (x + y) 10) : w + head (addLnat xs ys) : tail (addLnat xs ys)

请注意,这会导致糟糕的性能,因为您正在进行两次递归调用,这会导致指数爆炸。

更重要的是,即使忽略性能,以上看起来也是错误的,因为 w + ... 可能会溢出 10。想想9999加1:需要达到层叠的效果。

尝试修改您的函数,使其接受额外的 carry 个参数。