Каков простой способ дождаться, а затем обнаружить нажатия клавиш в Haskell?

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

Если кто-нибудь знает какие-нибудь библиотеки или какие-то хитрости для этого, было бы здорово!

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


person TaslemGuy    schedule 08.10.2010    source источник
comment
Здесь есть похожий поток из консоли сразу, а не после новой строки"> stackoverflow.com/questions/2983974/   -  person Pedro Rodrigues    schedule 09.10.2010
comment
Большинство библиотек с графическим интерфейсом (например, gtk2hs) имеют операцию типа onKeyPress — если вы делаете что-то крупное или для распространения, рассмотрите их.   -  person Thomas M. DuBuisson    schedule 09.10.2010


Ответы (2)


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

person Ollie Saunders    schedule 09.10.2010
comment
Я бы также упомянул о функции hSetEcho, которая позволяет подавлять эхо символов в stdout при использовании getChar. - person Dmitry Bespalov; 16.10.2012

import System.IO

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

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

person keegan    schedule 08.10.2010
comment
Это проблема, которую я обнаружил, она довольно плохо работает в Windows и требует новой строки перед отправкой. - person TaslemGuy; 13.10.2010