私はscalaでscalaz 6.0を使用しています。入力ストリームから読み取るために iteratees を使用しています。
私が持っている simple.txt という単純なファイルを次に示します。
これ
は
テストです
私の iteratee は行を印刷するために io モナドを構築します
def printLines: IterV[String, IO[Unit]] = {
def step(currentIO: IO[Unit])(input: Input[String]): IterV[String, IO[Unit]] =
input match {
case El(x) => Cont(
step(
currentIO.flatMap(_ => putStrLn(x))
)
)
case IterV.Empty() => Cont(step(currentIO))
case EOF() => Done(currentIO, EOF[String])
}
Cont(step(io()))
}
enumeratorM を使用する場合
getFileLines(new File(".../simple.txt"))(printLines).flatMap(_.run).unsafePerformIO
正しい出力を取得します。
使おうとすると
getLines(printLines).flatMap(_.run).unsafePerformIO
「これ」だけがコンソールに返されます。getLines は標準入力ストリームを使用します。iteratee にデバッグ ステートメントを追加しましたが、getLines は最初の行の後に EOF() を送信しているようで、解決できませんでした。