目标是将Nim在Haskell中的游戏编码为学校作业。我是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)
答案 0 :(得分:7)
问题是默认情况下stdout
是行缓冲的,这意味着在打印换行符之前不会输出任何内容。有两种方法可以解决这个问题:
hFlush stdout
刷新缓冲区。hSetBuffering stdout NoBuffering
禁用输出缓冲。此外,使用getChar
和ord
将读取单个字符并为您提供其ASCII值,这可能不是您想要的。要阅读和解析数字,请使用readLn
:
import System.IO (hFlush, stdout)
readInt :: String -> IO Int
readInt msg = do
putStr (msg ++ "> ")
hFlush stdout
readLn
答案 1 :(得分:1)
readChar
一次只能读取一个字符。我假设您想要读取整行,将其转换为数字(可能具有多个数字),然后继续。您需要使用getLine :: IO String
和read :: Read a => String -> a
:
readInt :: String -> IO Int
readInt msg = do
putStr (msg ++ "> ")
hFlush stdout
inp <- getLine
return (read inp)