- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑这个代码(取自 here 并修改为使用字节而不是字符行)。
import java.io.{ File, InputStream, BufferedInputStream, FileInputStream }
import scalaz._, Scalaz._, effect._, iteratee.{ Iteratee => I, _ }
import std.list._
object IterateeIOExample {
type ErrorOr[+A] = EitherT[IO, Throwable, A]
def openStream(f: File) = IO(new BufferedInputStream(new FileInputStream(f)))
def readByte(s: InputStream) = IO(Some(s.read()).filter(_ != -1))
def closeStream(s: InputStream) = IO(s.close())
def tryIO[A, B](action: IO[B]) = I.iterateeT[A, ErrorOr, B] {
EitherT(action.catchLeft).map(r => I.sdone(r, I.emptyInput))
}
def enumBuffered(r: => BufferedInputStream) = new EnumeratorT[Int, ErrorOr] {
lazy val reader = r
def apply[A] = (s: StepT[Int, ErrorOr, A]) => s.mapCont(k =>
tryIO(readByte(reader)) flatMap {
case None => s.pointI
case Some(byte) => k(I.elInput(byte)) >>== apply[A]
})
}
def enumFile(f: File) = new EnumeratorT[Int, ErrorOr] {
def apply[A] = (s: StepT[Int, ErrorOr, A]) =>
tryIO(openStream(f)).flatMap(stream => I.iterateeT[Int, ErrorOr, A](
EitherT(
enumBuffered(stream).apply(s).value.run.ensuring(closeStream(stream)))))
}
def main(args: Array[String]) {
val action = (
I.consume[Int, ErrorOr, List] &=
enumFile(new File(args(0)))).run.run
println(action.unsafePerformIO())
}
}
最佳答案
在您的代码的不同位置创建异常并打印它们的堆栈长度后,我觉得您的代码没有溢出。一切似乎都以恒定的堆栈大小运行。所以我找了其他地方。最终我复制了 consume
的实现并添加了一些堆栈深度打印并确认它在那里溢出。
所以这溢出:
(I.consume[Int, Id, List] &= EnumeratorT.enumStream(Stream.fill(10000)(1))).run
(I.putStrTo[Int](System.out) &= EnumeratorT.enumStream(Stream.fill(10000)(1)))
.run.unsafePerformIO()
putStrTo
用途
foldM
并且以某种方式不会导致溢出。所以我想知道是否
consume
可以按照
foldM
来实现.我只是从消费和调整中复制了一些东西,直到它编译:
def consume1[E, F[_]:Monad, A[_]:PlusEmpty:Applicative]: IterateeT[E, F, A[E]] = {
I.foldM[E, F, A[E]](PlusEmpty[A].empty){ (acc: A[E], e: E) =>
(Applicative[A].point(e) <+> acc).point[F]
}
}
关于scala - 如何在不溢出堆栈的情况下将 IO 与 Scalaz7 Iteratees 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16138096/
使用 Play 2.1-RC1 我无法编写简单的测试。 这是操作代码: def echoTestTagFromXml = Action(parse.xml) { request => (req
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我
假设我正在从 InputStream 读取内容。 我通常会如何做: val inputStream = ... try { doStuff(inputStream) } finally {
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why can’t a duplicate variable name be declared in a n
我正在为我的 Play 应用程序 Controller 编写测试用例,但在获取操作结果时遇到了问题。 val jsonresult = UserController.importOPML()(
可以使用流(惰性列表)从多个(为简单起见说两个)源中按需提取。 Iteratees 可用于处理来自单一来源的数据。 是否有类似 Iteratee 的功能概念来处理多个输入源?我可以想象一个 Itera
我正在尝试编写一个枚举器,用于使用 Scalaz 从 java.io.BufferedReader 逐行读取文件7 的 iteratee 库,目前只为 java.io.Reader 提供一个(非常慢的
首先,我了解迭代器的方式,足够了解我可以编写一个简单且有缺陷的实现,而无需引用任何现有的实现。 我真正想知道的是为什么人们似乎觉得它们如此迷人,或者在什么情况下它们的好处证明了它们的复杂性。将它们与惰
我在 Haskell 中有下一个代码,这对于读取文件的第一行很好,但我需要读取目录中文件的所有内容(许多文件递归)。我正在尝试更改 firstLineE 函数,我不明白如何更改行: EIO.enumF
在 Haskell 中,Iteratee based I/O看起来很吸引人。 Iteratees 是一种可组合的、安全的、快速的 I/O 方法,其灵感来自于函数式语言中的“fold”又名“reduce
我有一个简单的基于 attoparsec 的 pdf parser .它工作正常,直到与 iteratee 一起使用。 当输入的大小超过缓冲区大小时。 import qualified Data.By
play2中有一个play.api.libs.iteratee包,其中有一个大对象Iteratee,该行有1000多行。 为什么play2需要这么大的对象以及如何理解它? 最佳答案 我刚刚写了一篇文章
目前,有两种流行的选择来实现 iteratee pattern : enumerator package和 iteratee package . 它们的相对优势是什么?一个比另一个更好,还是取决于用例
我试图弄清楚 Lodash iteratee 的工作原理以及我将在哪里使用它。 The documentation says: Creates a function that invokes func
我希望能够创建一个可以无限重复一系列元素的枚举器,但我无法找到一种方法。当我创建递归枚举器时,当我尝试引用它时,似乎会溢出堆栈。例如,为了创建一个重复 A,B,C,D,A,B,C,D,A,B,C,D,
下划线 _.each ,有什么方法可以使用命名函数作为迭代器并向其传递参数吗? parseItems: function() { return _.each(this.items, this.pa
我正在使用 play2 和 reactivemongo 从 mongodb 获取结果。结果的每一项都需要进行转换以添加一些元数据。之后我需要对其进行一些排序。 为了处理转换步骤,我使用 enumera
我编辑了下面的代码,因为我认为我在 iter.next 问题之上错误地组合了 IterV 对象。 我正在 scalaz 中尝试使用 Iteratee,我想知道为什么以下内容不起作用。这是我所拥有的:
最近在玩scalaz.iteratee和 Play 的 iteratee .我认为 iteratee 提供模块化而不是旧的命令式 while 循环是一个好主意——目的是使用一个函数作为每个新行的处理程
我正在使用 underscorejs uniq 方法。 _.uniq( [{ name: 'a', family: 't' }, { name: 'b', family: 'n' }],
我是一名优秀的程序员,十分优秀!