这是我已编写的代码。我能够得到一个整数的交叉和。
module Blueprint where
import Prelude
crosssum :: Integer -> Integer -> Integer
crosssum i n
|n < 1*10^i = n
|otherwise = let(d,m)=n`divMod` (1*10^i) in m + crosssum i d
crosssumalt :: Integer -> Integer -> Integer
crosssumalt i n
|n < 1*10^i = n
|n < 0 = let(d,m)=n`divMod`(1*10^i) in m + crosssumalt i d
|otherwise = let(d,m)=n`divMod`(1*10^i) in m - crosssumalt i d
gencrosssum :: Integer -> Bool -> Integer -> Integer
gencrosssum i bool n
|bool==False=crosssum i n
|otherwise=crosssumalt i n
我的问题是,如果用户在参数中键入Bool“True”,它应该这样做:54321 = -5 + 43 - 21 = 17或1234567 = 1 - 234 + 567 = 334.错误是正常的交叉总和。所以gencrosssum True 54321给了我-17而不是17(它应该总是给出一个正整数)。我的想法是在crossumalt中设置一个可以将负面转为正面的守卫,但是在守卫中筑巢的守卫会给我解析错误。也许有人会如此友善地给我一个更好的解决方案,或者告诉我如何能够将一个警卫放在gencrosssum中,将负面变成积极的。