在Haskell中等待然后检测按键的简单方法是什么?

Tas*_*Guy 9 io haskell interactive

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

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

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

Oll*_*ers 15

如果您不想阻止,可以使用hReady检测是否已按下某个键.这对于您希望程序运行的游戏非常有用,并且无论何时发生,都可以在不暂停游戏的情况下选择按键.

这是我用于此的便利功能:

ifReadyDo :: Handle -> IO a -> IO (Maybe a)
ifReadyDo hnd x = hReady hnd >>= f
   where f True = x >>= return . Just
         f _    = return Nothing
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

stdin `ifReadyDo` getChar
Run Code Online (Sandbox Code Playgroud)

返回一个Maybe,Just如果按下了一个键,Nothing否则.

  • 我还提到了`hSetEcho`函数,它允许使用`getChar`来抑制回显字符到`stdout`. (2认同)

kee*_*gan 9

import System.IO

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

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

  • 但它在使用GHC的Windows上不起作用. (2认同)