我试图总结通过IO给出的所有用户输入。 总和应以值0开始,然后连续添加用户输入。 IO程序(主)应该运行直到停止并始终接受输入并将其添加到前一个总和。
print "Welcome!"
print "Current sum is = 0"
main = do putStrLn "Current sum = "++ read summy
input <- getLine
let summy = (read summy + read input)
main
这是我试图让它运行的代码。我的问题是我无法将开头的总和定义为0,我不确定如何解决问题。
我该怎么做? 提前谢谢
答案 0 :(得分:3)
你遇到的问题是你定义的函数(main
)的类型为IO ()
,如果你想要一个递归总和,你需要传递当前值。
mainSum :: Double -> IO ()
mainSum accumulator = do putStrLn $ "the current sum = " ++ show accumulator
input <- getLine
let summy = read input + accumulator
mainSum summy
但是如果你可以避免IO
部分(在这种情况下阅读输入),我建议将它与计算部分分开。函数read
也是部分的,即read "PWND!" :: Double
产生错误 - 这是不可取的 - 所以切换到像
safeRead :: Read a => String -> Maybe a
在这个程序的未来版本中切换到这个可能是一个好主意。
顺便说一句 - 你现在的程序甚至不会编译 - 那些print
- 语句不正确的haskell代码如果不包含在“更大的函数”中那么试着这样做
main :: IO ()
main = do print ...
print ...
mainSum 0