2

関数型プログラミング言語に慣れるために、Haskell を学習しようとしています。手始めに、 interviewstreetでいくつかの問題に挑戦することにしました。標準入力からの読み取りと、haskell の遅延 io を使用した一般的な io の実行に問題があります。

ほとんどの問題では、標準入力から次の形式でデータが取得されます。

n
data line 1
data line 2
data line 3
...
data line n

ここで、n は stdin からの次の行の数で、次の行はデータです。

一度に n 行ずつプログラムを実行し、ソリューションを標準出力に返すにはどうすればよいですか?

stdin 入力がそれほど大きくないことはわかっていますが、haskell の使用方法を学ぶためだけに、入力がメモリに収まるサイズよりも大きいふりをして、一度に 1 行ずつ評価することについて質問しています。

4

2 に答える 2

10

interactを と組み合わせて使用lines​​すると、stdin からのデータを一度に 1 行ずつ処理できます。interactこれは、標準入力にアクセスし、各改行でデータを分割し、入力の各行に関数を適用し、出力を元に戻すlinesためのリスト内包表記を使用するプログラムの例です。perLineunlinesperLine

main = interact processInput

processInput input = unlines [perLine line | line <- lines input]

perLine line = reverse line -- do whatever you want to 'line' here!

stdin を介して取得するデータのサイズについて心配する必要はありません。Haskell の遅延性により、実際に作業している部分だけを常にメモリに保持することが保証されます。

n編集: それでも最初の行だけで作業したい場合takeは、上記の例の関数を次のように使用できます。

processInput input = unlines [perLine line | line <- take 10 (lines input)]

これにより、最初の 10 行が読み取られて処理された後、プログラムが終了します。

于 2012-06-01T23:06:53.877 に答える