Haskell:立即从控制台读取输入字符,而不是在换行符之后

Ste*_*ves 27 windows io haskell buffering ghc

我试过这个:

main = do
    hSetBuffering stdin NoBuffering 
    c <- getChar
Run Code Online (Sandbox Code Playgroud)

但它一直等到按下输入,这不是我想要的.我想在用户按下它后立即读取该字符.

我在Windows 7上使用ghc v6.12.1.

编辑:我的解决方法是从GHC转移到WinHugs,它正确支持这一点.

And*_*ewC 21

是的,这是一个错误.这是一个解决方法来保存人们点击和滚动:

{-# LANGUAGE ForeignFunctionInterface #-}
import Data.Char
import Foreign.C.Types
getHiddenChar = fmap (chr.fromEnum) c_getch
foreign import ccall unsafe "conio.h getch"
  c_getch :: IO CInt
Run Code Online (Sandbox Code Playgroud)

所以,你可以替换调用getChar与调用getHiddenChar.

请注意,这是针对Windows上的ghc/ghci的解决方法.例如,winhugs没有bug,这段代码在winhugs中不起作用.

  • 我喜欢这个解决方案。但是请注意,“不安全”将导致对“提取”的阻塞调用,以阻塞程序中的所有其他线程。我是Hackage上[ʻhidden-char`](http://hackage.haskell.org/package/hidden-char)软件包的作者,该软件包使用不安全的FFI具有此功能的变体。 (2认同)

Art*_*ius 20

可能是一个bug:

http://hackage.haskell.org/trac/ghc/ticket/2189

以下程序重复输入的字符,直到按下退出键.

import IO
import Monad
import Char

main :: IO ()
main = do hSetBuffering stdin NoBuffering
          inputLoop

inputLoop :: IO ()
inputLoop = do i <- getContents
               mapM_ putChar $ takeWhile ((/= 27) . ord) i
Run Code Online (Sandbox Code Playgroud)

由于hSetBuffering stdin NoBuffering行,因此不必在按键之间按Enter键.此程序在WinHugs中正常工作(sep 2006版).但是,GHC 6.8.2在按下回车键之前不会重复这些字符.使用所有GHC可执行文件(ghci,ghc,runghc,runhaskell)重现问题,在Windows XP Professional上使用cmd.exe和command.com ...