Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取行,直到按下haskell中的ESC按钮_Haskell_Line_Stdin - Fatal编程技术网

读取行,直到按下haskell中的ESC按钮

读取行,直到按下haskell中的ESC按钮,haskell,line,stdin,Haskell,Line,Stdin,在按下ESC按钮之前,我需要查看实际线路。我怎么检查 lines = do line <- getLine if (== "/ESC") --this condition is wrong then ... else do ln <- lines return ... 行 做 行正确的转义方法是使用反斜杠,字符是'\ESC',因此条件是 if line == "\ESC

在按下ESC按钮之前,我需要查看实际线路。我怎么检查

lines
   = do
      line <- getLine
      if (== "/ESC") --this condition is wrong
         then ...
         else do
            ln <- lines
            return ...
行
做

行正确的转义方法是使用反斜杠,字符是
'\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)
主模块(Main),其中
导入系统.IO
main::IO()
main=do
hSetBuffering标准不缓冲
getUntilEsc“”
getUntilEsc::字符串->IO()
getUntilEsc acc=do
c返回()
“\n'->do putStrLn$”您输入了“++反向acc”
getUntilEsc“”
_->getUntilEsc(c:acc)
这就是你需要的。您必须按字符进行读取,并且需要关闭stdin的缓冲区,以便可以立即读取字符,而不仅仅是在输入换行符之后

请注意,在Windows上关闭缓冲不起作用。我不知道这个问题最近是否得到了解决。
此外,正如@Daniel Wagner所报告的,很可能是Windows命令提示符没有将ESC传递给应用程序。

mmm。。。检查输入是否等于“\ECS”。但它不会检查按钮是否按下。或者我错了?它检查它得到的行是否是
“\ESC”
,因此需要按下回车键或回车键。如果要在按下
\ESC
时立即执行操作,则需要读取单个字符,这意味着使用
getChar
而不是
getLine
,并关闭
stdin
的缓冲-后者在Windows上不起作用,我不知道现在是否有。我想以前有人告诉过我Windows的命令提示符没有发送escape密钥,所以这可能也是问题的一部分。你需要这样做吗?实现sentinel字符串会更容易,例如“quit”。然后您只需编写
如果(line==“quit”),那么。。。否则…