windows - Haskell: lea el carácter de entrada desde la consola inmediatamente, no después de la nueva línea
io ghc (4)
El paquete Haskeline funcionó para mí.
Si lo necesita para caracteres individuales, simplemente cambie la muestra ligeramente.
-
getInputLine
convierte engetInputChar
-
"quit"
convierte en''q''
-
++ input
convierte en++ [input]
main = runInputT defaultSettings loop
where
loop :: InputT IO ()
loop = do
minput <- getInputChar "% "
case minput of
Nothing -> return ()
Just ''q'' -> return ()
Just input -> do outputStrLn $ "Input was: " ++ [input]
loop
He intentado esto:
main = do
hSetBuffering stdin NoBuffering
c <- getChar
pero espera hasta que se presione la tecla enter, que no es lo que quiero. Quiero leer el personaje inmediatamente después de que el usuario lo presiona.
Estoy usando ghc v6.12.1 en Windows 7.
EDITAR: la solución para mí fue pasar de GHC a WinHugs, que lo admite correctamente.
Hmm .. En realidad, no puedo ver esta característica como un error. Cuando lee stdin
eso significa que quiere trabajar con un "archivo" y cuando pasa el búfer, está diciendo que no hay necesidad de leer el búfer. Pero eso no significa que la aplicación que está emulando ese "archivo" no debería usar el buffer de escritura. Para Linux, si su terminal está en modo "icanon", no envía ninguna entrada hasta que ocurra algún evento especial (como Enter presionado o Ctrl + D). Probablemente la consola en Windows tiene algunos modos similares.
Podría ser un error:
http://hackage.haskell.org/trac/ghc/ticket/2189
El siguiente programa repite los caracteres ingresados hasta que se presiona la tecla de escape.
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
Debido a la línea hSetBuffering stdin NoBuffering, no debería ser necesario presionar la tecla enter entre pulsaciones de teclas. Este programa funciona correctamente en WinHugs (versión sep 2006). Sin embargo, GHC 6.8.2 no repite los caracteres hasta que se presiona la tecla enter. El problema se reprodujo con todos los ejecutables de GHC (ghci, ghc, runghc, runhaskell), utilizando tanto cmd.exe como command.com en Windows XP Professional ...
Sí, es un error. Aquí hay una solución para evitar que las personas hagan clic y se desplacen:
{-# 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
De modo que puede reemplazar llamadas a getChar
con llamadas a getHiddenChar
.
Tenga en cuenta que esta es una solución para ghc / ghci en Windows. Por ejemplo, winhugs no tiene el error y este código no funciona en winhugs.