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
λ>

これは一度に1文字を消費します。

しかし、ターミナルでは:

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

一度に1行を消費します。

なぜ動作が異なるのですか?

4

1 に答える 1

12

ターミナルでプログラムを実行するとLineBuffering、デフォルトで使用されますが、ghciではに設定されていNoBufferingます。あなたはここでそれについて読むことができます。同様の動作を得るには、stdinからバッファリングを削除する必要があります。stdout

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 に答える