2014-12-19 2 views
1

В качестве упражнения я пытаюсь реализовать игру в Haskell. Однако я не понимаю, как работает IO. Я читала, что что-то подобное будет работать для того, чтобы сделать IO String, который возвращает GetLine использовать в чистом коде:IO проблемы в Haskell

main = do 
    foo <- getLine 
    do_something_with foo 

код я закончил с получил немного более сложным, и я не понимаю, почему это Wouldn Не работай. Мой код выглядит следующим образом:

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

Когда вы используете обозначения «делать», ваши заявления должны быть типа 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