2016-08-04 3 views
4

私はGHCiの中で、このエラーを取得していますハンドルはハスケルで半閉鎖エラーですか?このコードを実行した後</p> <p><code>*** Exception: <stdin>: hGetLine: illegal operation (handle is semi-closed)</code></p> <p>を::

main = do 
    interact $ unlines . fmap proccess . take x . lines 
    readLn :: IO Int 

そして私は原因がtake xあるかなり確信しています。 x行の入力を相互に使用して読むまたはinteractだけのソロプレーヤーですか?

+0

'interact'はstdinを半閉じた状態にします。私は、あなたの関数が正しく最初に動作したと仮定し、それ以降の呼び出しは失敗しますか? GHCiを閉じて再オープンするか、プログラムをコンパイルして実行してください。 –

+0

正確に、 'stdin'の読み込みはすべて失敗しました。 –

+0

補足として、閉じたハンドルをstdinにもう一度開くことができますが、ghciを閉じて再度開くことは可能ですか? –

答えて

8

interactで行うことはできません。舞台裏では、interactは、とそれ自身のためにstdinの全体を主張している。これにより、ハンドルは“セミクローズ”の状態になり、入力の全体が既に消費されているため(遅延して)、ハンドルを閉じる以外の操作はできません。概念的にinteractは、標準入力のすべてを消費

は—

import Control.Monad (replicateM) 

getLines :: Int -> IO [String] 
getLines n = replicateM n getLine 
2

とラインの有限数を読んでみてください。その後、readLnに電話するのは意味がありません。 (正確に)10個の文字列のリストになります。ここ

import Control.Monad 

main = do input <- replicateM 10 getLine 
      ... 

input

は線のみの一定数を読み取るには、のようなものを使用。

特殊な状況に遭遇したときに読み込みを停止したい場合や、行数を減らしたい場合は、もっと複雑になります。

関連する問題