Правильный способ избежать это с обратной косой черты, характер '\ESC'
, поэтому условие будет
if line == "\ESC"
Но я не уверен, что каждый терминал передает '\ESC'
через приложению.
Если вы хотите, чтобы немедленно прекратить при нажатии клавишу ESC , что-то вдоль линий
module Main (main) where
import System.IO
main :: IO()
main = do
hSetBuffering stdin NoBuffering
getUntilEsc ""
getUntilEsc :: String -> IO()
getUntilEsc acc = do
c <- getChar
case c of
'\ESC' -> return()
'\n' -> do putStrLn $ "You entered " ++ reverse acc
getUntilEsc ""
_ -> getUntilEsc (c:acc)
является то, что вам нужно. Вы должны читать по-разному, и вам нужно отключить буферизацию stdin
, поэтому символы сразу доступны для чтения, и не только после ввода новой строки.
Обратите внимание, что при отключении буферизации Windows не работает. Я не знаю, было ли это исправлено в последнее время. Кроме того, как сообщал @ Даниэль Вагнер, вполне возможно, что командная строка Windows не передает приложение ESC.
Вам нужно * сделать так? Было бы проще реализовать целую цепочку, например «quit». Затем вы просто пишете 'if (line ==" quit "), затем ... else ...' –