【发布时间】:2019-04-06 13:41:54
【问题描述】:
我想将两个正数相加,而不使用任何基本运算符,例如 + 进行加法。我已经解决了这个问题(在 add''' 函数中)(我认为)可能效率不高,但这不是现在的重点。我收到了很多类型错误,但是我不知道如何处理,而且我很困惑,因为它在纸上工作,而且我来自 python。
加 1245 7489
--add :: Int -> Int -> Int
add x y = add'' (zip (add' x) (add' y))
where
add' :: Int -> [Int]
add' 0 = []
add' x = add' (x `div` 10) ++ [x `mod` 10]
转换 [1,2,4,5] [7,4,8,9] 然后将它们压缩在一起 [(1,7),(2,4)....]
add'' :: [(Int,Int)] -> [Int]
add'' (x:xs) = [(add''' (head x) (last x))] ++ add'' xs
summary [8,6,...] 总和达到 10 时会发生什么尚未实现。
where
--add''' :: (Int,Int) -> Int
add''' x y = last (take (succ y) $ iterate succ x)
两个数相加
【问题讨论】:
-
你的
add函数是Int -> Int -> Int并且你的add''函数返回一个[Int] -
还有更简单的方法来做你想做的事情,特别是如果数字总是正数,这意味着它们可以代表某物的长度......
-
所以
+是基本的,但mod和div不是? :)(开玩笑)。 -- 很好的练习! -
您意识到
succ :: Int -> Int只是定义为succ x = x + 1,对吧?您正在跳过多个抽象层以避免+,它无论如何都隐藏在最后一层中。 -
你也可以明确定义自己的
succ'函数(succ 0 = 1; succ 1 = 2; -- etc),然后弄清楚如何处理携带。