在 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
个参数。
我目前正在尝试学习 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
个参数。