10

我对 Haskell 很陌生,所以我正在寻找一种简单的方法来检测按键,而不是使用getLine.

如果有人知道任何库,或者知道这样做的一些技巧,那就太好了!

如果有更好的地方问这个问题,请指导我,我会很感激。

4

2 回答 2

16

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

如果按键被按下,则返回 a Maybe,否则。JustNothing

于 2010-10-09T15:42:37.713 回答
9
import System.IO

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

我不知道这什么时候可以保证工作。将终端置于“原始”模式是一个依赖于系统的过程。但它适用于 Linux 上的 GHC 6.12.1。

于 2010-10-08T22:47:05.187 回答