我是一个Haskell初学者,我刚开始换我周围的单子头,但我真的不明白呢。 我正在写一个游戏,包括要求用户输入和应对的。 这里是我的功能的简化版本:
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):
大胆的是我在打字的东西。
很显然,我有一些主要的概念上的错误,但我不知道是什么。 需要注意的是它的工作原理正确解释和编译时失败。