Haskell中的IO问题

时间:2014-12-19 17:07:48

标签: haskell io

作为练习,我试图在Haskell中实现一个游戏。然而,我似乎没有掌握的是IO的工作原理。我读过,像这样的东西可以使得getLine返回的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 个答案:

答案 0 :(得分:4)

当你使用&#39;做&#39;表示法语句应为Monad m => m a类型。让我们看看他们暗示的类型和monad ...

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 monad而不是show你会使用print

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