Voglio usare IO monade.Scalaz's traverse_ con IO monad
Ma questo codice non funziona con file di grandi dimensioni. Ricevo un StackOverflowError. Ho provato l'opzione -DXss
, ma genera lo stesso errore.
val main = for {
l <- getFileLines(file)(collect[String, List]).map(_.run)
_ <- l.traverse_(putStrLn)
} yield()
Come posso farlo?
Ho scritto Iteratee che restituisce tutti gli elementi.
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
Questo è anche lo stesso risultato.
Penso che sia causato dall'implementazione IO.
La prima domanda è: * perché/come * è non in esecuzione di un file di grandi dimensioni State ricevendo una errore di overflow dello stack, un errore di memoria esaurita o qualcos'altro? –
Ricevo un errore StackOverflowError. Ho provato l'opzione -DXss, ma ho lanciato lo stesso errore. –
D'accordo, penso che la monade IO aggiunga un po 'di sfida. – huynhjl