【发布时间】:2021-01-10 11:37:58
【问题描述】:
我才刚刚开始学习 Haskell,目前我正在探索列表的可能性。 我想总结两个列表,但不知何故出错了。
所以:
输入:sumTwoLists [2,5,7,7,9] [1,2,2](基本上是 25779 + 122)
输出:[2,5,9,0,1]
首先,我把整个列表倒过来了,因为多位数字的加法必须从末尾开始:
reverseList :: [Int] -> [Int]
reverseList [] = []
reverseList (x:xs) = reverseList xs ++ [x]
它有效。然后我实现了一个add函数:
add :: (Num a) => [a] -> [a] -> [a]
add _ [] = []
add [] _ = []
add (x:xs) (y:ys) = (x + y) : add xs ys
但是当一个列表比另一个短时,它就会出错。 (添加 [2,5,7,7,9] [1,2,2] = [3,7,9]) 所以finction也必须在小数的末尾加0([1,2,2] = [1,2,2,0,0]。)
然后我尝试像这样实现 sumTwoLists 函数:
sumTwoLists :: [Int] -> [Int] -> [Int]
sumTwoLists (x:xs) (y:ys) = reverseList ((reverseList (x:xs)) add (reverseList (y:ys)))
但是这段代码没有考虑元素不能大于9的事实。 我不想将元素转换为 Int 或 Integer,这就是我不使用它们的原因。
我基本上只是想反转列表,然后在最短的列表中添加 0,然后将每个元素与另一个列表中的元素相加,如果结果>9,则结果除以 10(mod? ) 并且相邻的数量增加
如有任何帮助,我将不胜感激!
【问题讨论】:
-
似乎您只需要能够将数字与其数字列表相互转换 - 然后您可以转换两个列表,添加结果数字,并将结果转换回列表。要编写这样的函数,您可以使用显式递归,或者使用
show和read“作弊”在数字和字符串之间进行转换,因为字符串是字符列表,在这种情况下,字符将是数字。跨度> -
@RobinZigmond,我知道我可以做到,而且我之前已经做到了,但是现在我正在学习列表,我想学习如何直接在列表中进行操作,而不需要转换
标签: list haskell element add reverse