Переход Скалаза с монадой ввода-вывода

Я хочу использовать монаду ввода-вывода.

Но этот код не работает с большим файлом. Я получаю StackOverflowError. {{1 }} Я попробовал вариант -DXss , но он выдает ту же ошибку.

val main = for {
  l <- getFileLines(file)(collect[String, List]).map(_.run)
  _ <- l.traverse_(putStrLn)
} yield ()

Как я могу это сделать?


Я написал Iteratee, который выводит все элементы.

def putStrLn[E: Show]: IterV[E, IO[Unit]] = {
  import IterV._
  def step(i: IO[Unit])(input: Input[E]): IterV[E, IO[Unit]] =
    input(el = e => Cont(step(i >|> effects.putStrLn(e.shows))),
      empty = Cont(step(i)),
          eof = Done(i, EOF[E]))
  Cont(step(mzero[IO[Unit]]))
}
val main = for {
  i <- getFileLines(file)(putStrLn).map(_.run)
} yield i.unsafePerformIO

Это также тот же результат.

Я думаю, это вызвано реализацией ввода-вывода.

6
задан Sanshiro Yoshida 4 October 2011 в 02:00
поделиться