作为练习,我试图在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 =
。
答案 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