【问题标题】:What is a simple way to wait for and then detect keypresses in Haskell?在 Haskell 中等待然后检测按键的简单方法是什么?
【发布时间】:2011-04-23 03:04:07
【问题描述】:

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

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

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

【问题讨论】:

  • 这里有一个类似的帖子stackoverflow.com/questions/2983974/…
  • 大多数 GUI 库(例如:gtk2hs)都有 onKeyPress 类型的操作 - 如果您正在做任何大型或分发的事情,请考虑这些。

标签: haskell io interactive


【解决方案1】:
import System.IO

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

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

【讨论】:

  • 这是我发现的问题,它在 Windows 上效果不佳,并且在提交之前需要换行。
【解决方案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

【讨论】:

  • 我还要提一下hSetEcho 函数,它允许在使用getChar 时抑制将字符回显到stdout
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 2012-10-23
  • 2014-01-04
  • 2021-12-27
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多