8
import Data.Char

main = do 
    c <- getChar
    if not $ isUpper c
        then do putChar $ toUpper c
                main
        else putChar '\n'

在 GHCi 中加载和执行:

λ> :l foo.hs
Ok, modules loaded: Main.
λ> main
ñÑsSjJ44aAtTR
λ>

这一次消耗一个字符。

但是在终端中:

[~ %]> runhaskell foo.hs
utar,hkñm-Rjaer 
UTAR,HKÑM-
[~ %]>

它一次消耗一行。

为什么它的行为不同?

4

1 回答 1

12

当您在终端中运行程序时,它LineBuffering默认使用它,但ghci它设置为NoBuffering. 你可以在这里阅读。您将不得不从中删除缓冲stdinstdout获得类似的行为。

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'
于 2012-10-22T04:03:06.693 回答