Quiero usar la mónada IO.Traverse_ de Scalaz con IO monad
Pero este código no se ejecuta con un archivo grande. Obtengo un StackOverflowError. Probé la opción -DXss
, pero arroja el mismo error.
val main = for {
l <- getFileLines(file)(collect[String, List]).map(_.run)
_ <- l.traverse_(putStrLn)
} yield()
¿Cómo puedo hacerlo?
Escribí Iteratee que muestra todos los elementos.
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
Este es también el mismo resultado.
Creo que se debe a la implementación de IO.
La primera pregunta es por qué */* cómo es que no ejecuta con un archivo grande ¿usted está consiguiendo una ¿hay un error de desbordamiento de la pila, un error de falta de memoria o alguna otra cosa? –
Obtengo un StackOverflowError. Intenté la opción -DXss, pero arrojé el mismo error. –
De acuerdo, creo que la mónada IO agrega un poco de desafío. – huynhjl