【发布时间】:2011-10-03 10:12:12
【问题描述】:
我想使用 IO monad。
但此代码不适用于大文件。
我收到了 StackOverflowError。
我尝试了-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
这也是同样的结果。
我认为是IO实现造成的。
【问题讨论】:
-
第一个问题是为什么/如何它不运行大文件?您是否遇到堆栈溢出错误、内存不足错误或其他错误?
-
我收到了 StackOverflowError。我尝试了 -DXss 选项,但抛出了同样的错误。
-
同意,我认为 IO monad 增加了一点挑战。