目标是用 Haskell 编写 Nim 游戏作为学校作业。我是 Haskell 新手,当我尝试读取输入时会出现奇怪的行为。
目标是读取两个整数。它不是打印第一条消息,然后提示,然后继续第二条消息,而是只打印两条消息,而我无法提供正确的输入。这里有什么问题吗?
type Board = [Int] -- The board
type Heap = Int -- id of heap
type Turn = (Int, Int) -- heap and number of stars to remove
readInt :: String -> IO Int
readInt msg = do putStr (msg ++ "> ")
inp <- getChar
let x = ord inp
return x
readTurn :: Board -> IO(Turn)
readTurn b = do heap <- readInt "Select heap:"
amt <- readInt "Select stars:"
print heap
print amt
return(heap, amt)
问题是stdout
默认情况下是行缓冲的,这意味着在打印换行符之前不会输出任何内容。有两种方法可以解决这个问题:
- Use
hFlush stdout
打印提示后刷新缓冲区。
- Use
hSetBuffering stdout NoBuffering
在程序开始时禁用输出缓冲。
另外,使用getChar
and ord
将读取单个字符并给出它的 ASCII 值,这可能不是您想要的。要读取和解析数字,请使用readLn
:
import System.IO (hFlush, stdout)
readInt :: String -> IO Int
readInt msg = do
putStr (msg ++ "> ")
hFlush stdout
readLn
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)