是否需要在使用输入功能之前对其进行更改?

时间:2019-01-06 21:36:14

标签: haskell

我正在尝试编写一个函数,该函数接收两个表示自然数位的列表,并将它们取反。列表中也可能有任意数量的尾随0。

plus :: [Int] -> [Int] -> [Int]
-- Ex: "plus [0,1,2,0] [2,1,0]" meaning 210+12

我有3个单独的功能来执行问题的不同部分,而我无法让它们协同工作:


cleanString将数字按顺序放回(最高有效位在前),并删除所有多余的0(cleanString [0,1,2,0]输出[2,1,0]):

fromDigits接受类似[2,1,0]的列表并给出210

然后,在它们进入cleanString并添加结果两个整数之前,我无法获得实际的“加号”功能来通过fromDigits运行输入列表。在fromDigits (x.cleanString)处编译错误。


cleanString :: [Integer]->[Integer]
--reverse the string, then trim any leading zeroes
cleanString x = dropWhile(<1) y where y=reverse x

fromDigits :: [Integer] -> Integer
fromDigits xs = aux xs 0
    where aux [] acc = acc
          aux (x:xs) acc  = aux xs ((acc * 10) + x)

plus :: [Integer]->[Integer] -> Integer
plus x y = (fromDigits (x.cleanString))+(fromDigits (y.cleanString))

1 个答案:

答案 0 :(得分:3)

x不是一个函数,因此.不包含任何内容是没有意义的。您不应该执行x.cleanString,而应该执行cleanString x。与y相同。经过这些更改,您的程序似乎对我有用:

plus x y = (fromDigits (cleanString x))+(fromDigits (cleanString y))

即使您不必使用.,也可以只在函数上使用,而不要在xy上使用

plus x y = ((fromDigits.cleanString) x)+((fromDigits.cleanString) y)