[英]Haskell: Basic Reading Int
目標是將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)
問題是默認情況下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
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.