Haskell IO总结所有输入

时间:2016-01-09 22:46:05

标签: haskell io

我试图总结通过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,我不确定如何解决问题。

我该怎么做? 提前谢谢

1 个答案:

答案 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