Какой простой способ подождать, а затем обнаружить нажатия клавиш в Haskell? - PullRequest
9 голосов
/ 09 октября 2010

Я довольно новичок в Haskell, поэтому я ищу простой способ обнаружения нажатий клавиш, а не getLine.

Если кто-нибудь знает какие-либо библиотеки или какой-то трюк для выполненияэто было бы здорово!

И если есть лучшее место, чтобы спросить это, пожалуйста, направьте меня туда, я был бы признателен.

Ответы [ 3 ]

15 голосов
/ 09 октября 2010

Если вы не хотите блокировать, вы можете использовать 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 в противном случае.

9 голосов
/ 09 октября 2010
import System.IO

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

Я не знаю, когда это гарантированно сработает.Перевод терминала в «сырой» режим является системно-зависимым процессом.Но у меня это работает с GHC 6.12.1 в Linux.

0 голосов
/ 09 октября 2010

Вы можете использовать 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"
...