Я начинающий Хаскелл, я только начинаю обнимать Монад, но на самом деле я его не понимаю. Я пишу игру, состоящую из запроса пользователя на ввод и ответа. Вот упрощенная версия моей функции:
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):
Жирным шрифтом являются то, что я набрал.
Очевидно, у меня есть некоторые основные концептуальные ошибки, но я не знаю, что. Обратите внимание, что он корректно работает в интерпретаторе и сбой при компиляции.