2010-10-08 48 views
9

我是Haskell的新手,所以我正在尋找簡單的方法來檢測按鍵,而不是使用getLine在Haskell中等待並檢測按鍵的簡單方法是什麼?

如果有人知道任何圖書館,或一些伎倆做到這一點,這將是偉大的!

如果有更好的地方提出這個問題,請直接在那裏,我會很感激。

+0

這裏有一個類似的線程http://stackoverflow.com/questions/2983974/haskell-read-input-character-from-console-immediately-not-after-newline – 2010-10-09 01:17:19

+0

最GUI庫(例如:gtk2hs)有一個onKeyPress類型的操作 - 如果你做的任何事情都很大或分發,那就考慮這些。 – 2010-10-09 04:59:21

回答

14

如果你不想阻止你可以使用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 

返回一個MaybeJust如果按一個鍵,Nothing否則。

+2

我還會提到'hSetEcho'函數,它允許將回顯字符壓縮到' stdout',而使用'getChar'。 – 2012-10-16 17:40:04

8
import System.IO 

main :: IO() 
main = do 
    hSetBuffering stdin NoBuffering 
    x <- getChar 
    putStrLn ("You pressed: " ++ [x]) 

我不知道什麼時候可以保證工作。將終端置於「原始」模式是一個與系統相關的過程。但在Linux上,它適用於GHC 6.12.1。

+1

但是它在使用GHC的Windows上不起作用。 – 2010-10-09 00:25:39

+0

這就是我發現的問題,它在Windows上工作得相當糟糕,並且在提交之前需要換行符。 – TaslemGuy 2010-10-12 22:26:15

-1

您可以使用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" 
+1

你的第一個'pressKey'完全等價於'getChar'在這裏。 – 2010-10-09 15:39:56

+0

嗯,我知道。我的意思是,可以使用x,例如,「do {x < - getCbar; dosomething(read x :: Int)}或者不用 – danportin 2010-10-09 17:43:49

相關問題