我是Haskell的新手,所以我正在尋找簡單的方法來檢測按鍵,而不是使用getLine
。在Haskell中等待並檢測按鍵的簡單方法是什麼?
如果有人知道任何圖書館,或一些伎倆做到這一點,這將是偉大的!
如果有更好的地方提出這個問題,請直接在那裏,我會很感激。
我是Haskell的新手,所以我正在尋找簡單的方法來檢測按鍵,而不是使用getLine
。在Haskell中等待並檢測按鍵的簡單方法是什麼?
如果有人知道任何圖書館,或一些伎倆做到這一點,這將是偉大的!
如果有更好的地方提出這個問題,請直接在那裏,我會很感激。
如果你不想阻止你可以使用hReady
檢測是否一個鍵已經被按壓的情況。這對於您希望程序運行的遊戲非常有用,並且在發生遊戲時不會暫停遊戲,並在發生按鍵時進行按鍵操作。
這裏有一個方便的功能,我用這個:
ifReadyDo :: Handle -> IO a -> IO (Maybe a)
ifReadyDo hnd x = hReady hnd >>= f
where f True = x >>= return . Just
f _ = return Nothing
這可以這樣使用:
stdin `ifReadyDo` getChar
返回一個Maybe
是Just
如果按一個鍵,Nothing
否則。
我還會提到'hSetEcho'函數,它允許將回顯字符壓縮到' stdout',而使用'getChar'。 – 2012-10-16 17:40:04
import System.IO
main :: IO()
main = do
hSetBuffering stdin NoBuffering
x <- getChar
putStrLn ("You pressed: " ++ [x])
我不知道什麼時候可以保證工作。將終端置於「原始」模式是一個與系統相關的過程。但在Linux上,它適用於GHC 6.12.1。
但是它在使用GHC的Windows上不起作用。 – 2010-10-09 00:25:39
這就是我發現的問題,它在Windows上工作得相當糟糕,並且在提交之前需要換行符。 – TaslemGuy 2010-10-12 22:26:15
您可以使用getChar而不是getLine。這可能不是你想要的,但它是最簡單的方法。
pressKey :: IO()
pressKey = do x <- getChar
return x
但還有一種更簡單的方法。只要寫的getchar:
pressKey :: IO()
pressKey = getChar >> putStr "I am a String"
pressKey = putStrLn "Hi" >> getChar >> putStrLn "Bye"
你的第一個'pressKey'完全等價於'getChar'在這裏。 – 2010-10-09 15:39:56
嗯,我知道。我的意思是,可以使用x,例如,「do {x < - getCbar; dosomething(read x :: Int)}或者不用 – danportin 2010-10-09 17:43:49
這裏有一個類似的線程http://stackoverflow.com/questions/2983974/haskell-read-input-character-from-console-immediately-not-after-newline – 2010-10-09 01:17:19
最GUI庫(例如:gtk2hs)有一個onKeyPress類型的操作 - 如果你做的任何事情都很大或分發,那就考慮這些。 – 2010-10-09 04:59:21