Haskell 为什么isEOF不';不行?
以下是最简单完整的示例:Haskell 为什么isEOF不';不行?,haskell,io,stream,eof,Haskell,Io,Stream,Eof,以下是最简单完整的示例: import Control.Monad import System.IO loop :: IO () loop = do line <- getLine putStrLn line eof <- isEOF unless eof loop main = loop 资料来源: import Control.Monad import System.IO loop :: IO () loop =
import Control.Monad
import System.IO
loop :: IO ()
loop =
do line <- getLine
putStrLn line
eof <- isEOF
unless eof loop
main = loop
资料来源:
import Control.Monad
import System.IO
loop :: IO ()
loop =
do line <- getLine
eof <- isEOF
putStrLn $ "output: " ++ line
unless eof loop
main =
do hSetBuffering stdin LineBuffering
loop
import-Control.Monad
导入系统.IO
循环::IO()
环路=
从以下位置执行线:
注意:hIsEOF可能会阻塞,因为它必须尝试从流中读取数据,以确定是否还有更多数据要读取
putStrLn
不会影响isEOF
,但isEOF
会阻止程序在更多字符可用或您实际按下^D
之前到达putStrLn
因此,在程序中准备读取更多字符(如果有的话)之前,您不应该使用hIsEOF
/isEOF
。我想知道这是否与流缓冲有关?如果您hSetBuffering LineBuffer stdin
,会发生什么情况?是否使用Windows?在Windows中,EOF字符是Ctrl+Z
。耶。@Zeta,除了游戏,我什么都不用Windows。我在Arch Linux上。@MathematicalArchid,它是hSetBuffering stdin LineBuffering
实际上:-)是的,现在eof生效了@然而,当我把isEOF
放在putStrLn
之前时,MathematicalOrchid的输出被延迟了。很好,知道了这个信息,我终于能够完全修复我的程序了。非常感谢。我偶然发现了这个答案,但我不明白其中的解释。“字符可用”的确切含义是什么?以及“直到程序中有更多的字符时,您才准备好读取”-从何处读取?@ChrisStryczynski在这个问题中,字符是从GHCi或带有行缓冲的终端读取的。当用户键入字符并按enter键时,这些字符可用。或者,在行首按^D可发出EOF信号。程序无法预先知道用户将执行哪些操作,因此,isEOF
可能需要等待。除非小心地放置isEOF
,否则当输出也发送到GHCi/终端时,会出现令人困惑的定时问题。
import Control.Monad
import System.IO
loop :: IO ()
loop =
do line <- getLine
eof <- isEOF
putStrLn $ "output: " ++ line
unless eof loop
main =
do hSetBuffering stdin LineBuffering
loop