我正在尝试学习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+并重复,直到我们到达最后的情况。
关于为什么这不起作用/编译的任何想法?
答案 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
参数。