2014-12-19 44 views
1

作爲一個練習,我試圖在Haskell中實現一個遊戲。我似乎沒有掌握的是IO的工作原理。我看,這樣的事情就爲了讓IO字符串的工作,函數getline返回可用純代碼:Haskell中的IO問題

main = do 
    foo <- getLine 
    do_something_with foo 

我結束了該代碼得到了稍微複雜,我不明白爲什麼它止跌沒有工作。我的代碼如下所示:

game_loop game = do 
    show game 
    coords <- getLine 
    game_loop (add_move game (parse_coords coords)) 

main = game_loop new_game 

我得到這個樣子的錯誤:

src/main.hs:5:13: 
    Couldn't match type ‘IO’ with ‘[]’ 
    Expected type: [String] 
     Actual type: IO String 
    In a stmt of a 'do' block: coords <- getLine 
    In the expression: 
     do { show game; 
      coords <- getLine; 
      game_loop (add_move game (parse_coords coords)) } 

src/main.hs:8:1: 
    Couldn't match expected type ‘IO t0’ with actual type ‘[b0]’ 
    In the expression: main 
    When checking the type of the IO action ‘main’ } 

其中5號線是一個與<-和8是一個與main =

+1

'show'只返回一個字符串' ',它不會在屏幕上打印任何內容。也許'打印遊戲'而不是? (注意:'print x = putStrLn(show x)') – bheklilr

+0

感謝您的提示!我想這將是下一個之後。 :) – rausch

回答

4

當您使用'do'符號時,您的語句應該是Monad m => m a。讓我們看一下類型,什麼單子它們意味着...

game_loop game = do 
    show game     -- :: [Char] so this implies the list monad, [] 
    coords <- getLine   -- :: IO String so this implies the IO monad 
    game_loop (add_move game (parse_coords coords)) -- :: m a 

所以,你可能想的IO單子和替代show你可以使用print

gameLoop game = 
    do print game 
    gameLoop . addMove game . parseCoords =<< getLine 
+0

它的工作原理!我還沒有(明白)所有這一切意味着什麼,但感謝現在讓我過去。我保證我會再做更多的閱讀! :) – rausch