私は 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):
太字は私が入力したものです。
明らかに、いくつかの大きな概念上のエラーがありますが、何が原因かわかりません。インタープリターでは正しく機能し、コンパイルすると失敗することに注意してください。