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'