2016-01-09 67 views
1

我想總結所有通過IO給出的用戶輸入。 總和應該從0開始,然後連續添加用戶輸入。 IO程序(main)應該運行直到停止,並始終接受輸入並將其添加到前一個和。Haskell 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,我不知道該如何解決問題。

我該怎麼做? 由於事先

回答

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產生錯誤 - 這是不是desireable - 所以切換到像一個

safeRead :: Read a => String -> Maybe a 

可能是切換到該程序的未來版本中是個好主意。

順便說一句 - 你截至目前程序甚至不會編譯 - 那些print -statements是,如果不包括在「大功能」不正確的Haskell代碼所以儘量做這樣

main :: IO() 
main = do print ... 
      print ... 
      mainSum 0