在haskell中逐点添加两个列表

时间:2015-01-10 11:27:22

标签: 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+并重复,直到我们到达最后的情况。

关于为什么这不起作用/编译的任何想法?

1 个答案:

答案 0 :(得分:2)

(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。考虑添加1到9999:您需要实现级联效果。

尝试重新编写函数,以便需要额外的carry参数。