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 为什么在终端中执行getChar与在GHCi中执行getChar不同?_Haskell - Fatal编程技术网

Haskell 为什么在终端中执行getChar与在GHCi中执行getChar不同?

Haskell 为什么在终端中执行getChar与在GHCi中执行getChar不同?,haskell,Haskell,这一次消耗一个字符 但在终端中: λ> :l foo.hs Ok, modules loaded: Main. λ> main ñÑsSjJ44aAtTR λ> 它一次消耗一行 为什么会有不同的行为?当您在终端中运行程序时,它默认使用行缓冲,但在ghci中,它被设置为NoBuffering。你可以读到它。您必须从stdin和stdout中删除缓冲,才能获得类似的行为 [~ %]> runhaskell foo.hs utar,hkñm-Rjaer UTAR,HKÑM-

这一次消耗一个字符

但在终端中:

λ> :l foo.hs
Ok, modules loaded: Main.
λ> main
ñÑsSjJ44aAtTR
λ>
它一次消耗一行


为什么会有不同的行为?

当您在终端中运行程序时,它默认使用
行缓冲
,但在
ghci
中,它被设置为
NoBuffering
。你可以读到它。您必须从
stdin
stdout
中删除缓冲,才能获得类似的行为

[~ %]> runhaskell foo.hs
utar,hkñm-Rjaer 
UTAR,HKÑM-
[~ %]>
导入数据.Char
导入系统.IO
main=do
hSetBuffering标准不缓冲
hSetBuffering标准输出无缓冲
福
foo=do

c然后默认使用
ghci
使用
NoBuffering
,但每个程序中的事实都是
LineBuffering
,是吗?是的,在终端中,默认情况下是LineBuffering。禁用缓冲和刷新之间是否有区别,即用
do{putChar x;hflush stdout;}
替换
putChar x
,flush stdout类似于将输出从缓冲区发送到stdout。
[~ %]> runhaskell foo.hs
utar,hkñm-Rjaer 
UTAR,HKÑM-
[~ %]>
import Data.Char
import System.IO

main = do
    hSetBuffering stdin NoBuffering
    hSetBuffering stdout NoBuffering
    foo
foo = do
    c <- getChar
    if not $ isUpper c
        then do putChar $ toUpper c
                foo
        else putChar '\n'