Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 为什么isEOF不';不行?_Haskell_Io_Stream_Eof - Fatal编程技术网

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