2016-08-13 12 views
2

だから、僕は数を尋ねるプログラムを作っNとフィボナッチ数列のN番目の用語が表示さ:私はGHCiの中でプログラムを実行するとHaskellのコンソールプログラムの出力を間違った順序で

import Control.Monad (forever) 

main = forever $ do 
    putStrLn "" 
    putStr "Which Fibonacci sequence number do you need? " 
    number <- readLn :: IO Int 
    putStrLn $ "The Fibonacci number you wanted is " ++ (show $ fib number) ++ "." 
    putStrLn "" 
    where fib :: Int -> Integer 
      fib number = fibs !! number 
      fibs = 0 : 1 : zipWith (+) fibs (tail fibs) 

をまたはrunhaskellを介して、それは正常に実行されます。それは、ある数のために私に尋ね、私は同じ行にそれを入力することができますし、別の行に番号を返します。

[email protected]:~/Haskell$ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> :l Fib.hs 
[1 of 1] Compiling Main    (Fib.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> main 

Which Fibonacci sequence number do you need? 4 
The Fibonacci number you wanted is 3. 

しかし、私はコンパイルされたプログラムを実行すると、それはこれを返します。

[email protected]:~/Haskell$ ./Fib 

4 
Which Fibonacci sequence number do you need? The Fibonacci number you wanted is 3. 

I.e.私が番号を入力するのを待ってから、すべてのプロンプトを1行に返します。 どうしたのですか?これを回避する方法はありますか?

+2

見つかった回答は、http://stackoverflow.com/questions/2500459/wrong-io-actions-order-using-putstr-and-getlineを参照してください(これを重複としてマークするフラグはありません) –

+0

関連:https://stackoverflow.com/questions/13190314/haskell-do-monad-io-happens-out-of-order – Gallifreyan

答えて

1

stdoutはラインバッファリングをオンにしているように見えます。つまり、putStrの呼び出しはputStrLnが呼び出されるまで出力されていないバッファにのみ出力を格納しています。プロンプトにputStrLnを使用するか、stdoutでバッファリングを無効にすることで、出力を修正できます。

関連する問題