我是一个Haskell初学者,刚开始理解Monad,但我还没有完全掌握。我正在编写一个游戏,它需要向用户请求输入并做出响应。这是我函数的简化版本:
getPoint :: IO Point
getPoint = do
putStr "Enter x: "
xStr <- getLine
putStr "Enter y: "
yStr <- getLine
return $ Point (read xStr) (read yStr)
completeUserTurn :: (Board, Player) -> IO (Board, Player)
completeUserTurn (board, player) = do
putStr $ "Enter some value: "
var1 <- getLine
putStr $ "Enter another value: "
var2 <- getLine
putStr $ "Enter a point this time: "
point <- getPoint
if (... the player entered legal values ...) then do
putStr $ "This is what would happen if you did that: {stuff} do you want to do that? (y/n) "
continue <- getLine
if continue == "y" then
return (...updated board..., ...updated player...)
else
completeUserTurn (board, player)
else do
putStr "Invalid Move!\n"
completeUserTurn (board, player)
现在发生的情况是,提示会在文本之前出现,顺序不正确。
以下是我编译上述代码后发生的情况示例:
1
输入某个值:输入另一个值:2
3
4
这次输入一个点:输入x:输入y:y
正确吗?(y/n):
粗体字是我输入的内容。
显然,我有一些重大概念错误,但我不知道是什么。请注意,它在解释器中正常工作,在编译时失败。
value <- putStr "输入一个值:" *> hFlush stdout *> getLine
- CtC