簡體   English   中英

Haskell:基本閱讀Int

[英]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是行緩沖的,這意味着在打印換行符之前不會輸出任何內容。 有兩種方法可以解決這個問題:

  1. 打印提示后使用hFlush stdout刷新緩沖區。
  2. 在程序開始時使用hSetBuffering stdout NoBuffering來禁用輸出緩沖。

此外,使用getCharord將讀取單個字符並為您提供其ASCII值,這可能不是您想要的。 要讀取和解析數字,請使用readLn

import System.IO (hFlush, stdout)

readInt :: String -> IO Int
readInt msg = do
    putStr (msg ++ "> ")
    hFlush stdout
    readLn

readChar只能讀取一個字符。 我假設您想要讀取整行,將其轉換為數字(可能具有多個數字),然后繼續。 你需要使用getLine :: IO Stringread :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM