Chcę użyć IO Monad.Scalaz's traverse_ with IO monad
Ale ten kod nie działa z dużym plikiem. Otrzymuję komunikat StackOverflowError. Próbowałem opcji -DXss
, ale powoduje to ten sam błąd.
val main = for {
l <- getFileLines(file)(collect[String, List]).map(_.run)
_ <- l.traverse_(putStrLn)
} yield()
Jak mogę to zrobić?
Napisałem Iteratee, który jest wyprowadzeniem wszystkich elementów.
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
Jest to również ten sam wynik.
Wydaje mi się, że przyczyną jest implementacja IO.
pierwsze pytanie jest dlaczego */* jak prawda działa z dużym plikiem Czy otrzymujesz błąd przepełnienia stosu, błąd braku pamięci lub coś innego? –
Otrzymuję komunikat StackOverflowError. Próbowałem opcji -DXss, ale wystąpił ten sam błąd. –
Zgadzam się, myślę, że IO Monada dodaje trochę wyzwania. – huynhjl