如何从 Haskell 中的两个列表(+额外条件)中添加值

How to add values from two lists (+extra condition) in Haskell

这个练习我遇到了问题。很长一段时间以来,我一直在努力解决这个问题,寻找东西,但我做不到。

定义函数:

addLnat :: [Int] -> [Int] -> [Int]
mulLnat :: [Int] -> [Int] -> [Int]

addLnat 将两个数组中的数字相加,例如

addLnat [4,5,6] [8,5,2] ->  [2,1,9]

as [4+8给出2个进位1, 5+5+1给出1个进位1, 6+2+1 = 9]

Lnat,是一个 "list natural number",表示为以 10 为基数的数字列表,最低位在前。所以数字 654 是 [4,5,6]。

我得到的是:

addLnat :: [Int] -> [Int] -> [Int]
addLnat _ [] = []
addLnat [] _ = []
addLnat (x:xs) (y:ys) = (if (x+y) > 9 then x+y-10 else (x+y)):(addLnat xs ys)

我加号忽略进位。不知道如何解决。 如有任何帮助,我们将不胜感激。


我已根据 user5402 评论改进了解决方案,因此创建了 addLnat' cr xs ys,但是当我将携带作为参数传递时,它无法加载 - 最有可能我的语法错误:( (cr暂时为0,以后会被maths代替)

addLnat' c (x:xs) (y:ys) = d : addLnat' cr xs ys 
where d = if c+x+y < 9 then x+y else c+x+y-((quot (c+x+y) 10)*10) 
cr = 0 

有什么想法吗?

您需要编写一个接受进位参数的 addLnat 版本:

addLnat' c (x:xs) (y:ys) = d : addLnat c' xs ys
  where d = if c+x+y > 9 then ... else ...
        c' = ... the next carry bit ...

还有很多细节和极端情况需要考虑,但这是基本思路。 最后,

addLnat xs ys = addLnat' 0 xs ys  -- initially the carry is 0

我不是很擅长 haskell 但也许这会有所帮助;

add::[Int]->[Int]->[Int]
add x y = add' 0 x y

我们在那里定义了一个函数 add,它将使用 add' 来添加两个列表。主要思想是 "save" 携带并仔细处理极端情况。这里carry保存在"variable" rest

    add'::Int->[Int]->[Int]->[Int]
    add' 0 x []      = x 
    add' rest (x:[]) (y:[]) = [(r `mod` 10),(r `div` 10)]
       where r = x+y+rest
    add' y (x:xs) [] = add' (r `div` 10) ((r `mod` 10):xs) [] 
       where r = x+y
    add' rest (x:xs) (y:ys) = (r `mod` 10) : (add' (r `div` 10) xs ys)
       where r = x+y+rest 

列表 x 必须大于列表 y 但这不是问题

add [5,7,8] [4,3,2]  => [9,0,1,1] (correct)
add [1,2,3] [4,5,6]  => [5,7,9,0] (correct)