问题标签 [iterate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
455 浏览

haskell - 使用 Iteratee 库编写“wc -l” - 如何过滤换行符?

我正在尝试使用 Haskell Iteratee 库提出等效的“wc -l”。下面是“wc”的代码(它只计算单词 - 类似于 hackage 上的 iteratee 示例中的代码),并且运行速度非常快:



现在,如何扩展它来计算运行速度过快的行数?我做了一个版本,使用 Prelude.filter 仅过滤“\n”到长度,但它比 linux“wc -l”慢,因为内存太多,而且 gc(我猜是懒惰的评估)。所以,我使用 Data.ListLike.filter 编写了另一个版本,但它不会编译,因为它没有类型检查 - 在这里的帮助将不胜感激:


0 投票
0 回答
208 浏览

haskell - 我是唯一一个对 Iteratee、Enumerator 和 Enumeratee 名称感到困惑的人吗?

我喜欢 iteratees 作为 IO 的范例,但我对名称有些担心。

我无法与这些名字建立关系。有人可以解释他们的起源吗?定义data Stream a = Chunks [a] | EOF更糟,如果有的话。这不符合我之前的流概念,因为它只是整个流的一小部分。

似乎如果Iteratees 消耗东西,Enumerators 生产它们,并且Enumeratees 都使用 , 和 or , 之类的名称SinkSource并且Transformer可能ConsumerProducer更好的Transformer选择?除了约定之外,还有其他一些原因为什么这些名称不能很好地符合这些概念吗?

在这个主题的所有 17 个变体中,我对John Millikin 对 Haskell-Cafe 旧线程的看法很感兴趣,该线程关于静态消除“发散迭代”问题的变体(返回 Continue 的迭代问题对 EOF 的回应),但我对名称的问题几乎适用于我见过的所有版本。

0 投票
2 回答
156 浏览

haskell - 如何创建一个不断重试的枚举器

我正在使用 John Millikin 的 enumerator 包,并试图创建大致相当于 的东西Data.Enumerator.Binary.enumHandle,除了它连接套接字本身,然后尝试枚举生成的句柄。困难来自连接不可靠的事实,如果出现问题,我希望它重新连接并恢复枚举。

我通常希望 Enumerator 是它自己有意义的 Monad 实例,但由于它是函数的类型别名,它的单子行为只是其输入步骤的读取器,在这里似乎没有多大用处。我试图将一些东西放在一起,只是不断循环枚举器,使用catchError,但它没有达到我的预期,我无法弄清楚它在做什么,所以我想知道是否有人可以提出一个很好的惯用方法. 我对一个解决方案的框架很好,因为显然有很多细节我已经省略了。

有任何想法吗?

0 投票
1 回答
309 浏览

haskell - 当输入大于缓冲区大小时 attoparsec-iteratee 不起作用

我有一个简单的基于 attoparsec 的pdf parser。在与 iteratee 一起使用之前,它工作正常。当输入的大小超过缓冲区大小时。

输入:

因此,解析器在没有迭代器的情况下工作,可以处理足够大的块,但不能处理较小的块。迭代中的错误?在 attoparsec-iteratee 中?在我的代码中?有什么解决方法吗?这对我来说是一个非常紧迫的问题。

谢谢。

0 投票
2 回答
876 浏览

haskell - 受保护管道的行为与使用等待的管道相同吗?

管道是一个非常优雅、非常简单的迭代版本。您可以使用原语awaityield. Paolo Capriotti 扩展了带有受保护管道的管道的概念,它使用了稍微复杂的tryAwait原语,它允许管道在输入流用完后执行一些终结。

受保护的管道实现await在以下方面重新定义tryAwait

我的问题是:如果我编写针对更简单的管道实现的代码(使用awaitand yield),使用相同的代码,如果我切换到受保护的管道实现,它的行为是否相同?换句话说,就行为而言,受保护的管道代码可以简单地视为管道代码的超集吗?

0 投票
2 回答
1989 浏览

playframework-2.0 - 如何理解 play2 中的“Iteratee”?

play2中有一个包play.api.libs.iteratee,里面有一个Iteratee1000多行的大对象。

为什么play2需要这么大的对象,怎么理解?

0 投票
1 回答
7087 浏览

scala - Play 2.0中看不懂Iteratee、Enumerator、Enumeratee

我刚刚开始学习 Play 2.0 框架。我无法理解的一件事是play tutorial中描述的 Iteratee、Enumerator 和 Enumeratee 模式。我在函数式语言方面的经验很少。

这个模式有什么作用?

它如何帮助我编写非阻塞/反应式代码?

一些简单的例子会有所帮助。

0 投票
2 回答
2229 浏览

scala - 如何编写枚举器以沿不同边界对枚举器进行分块

因此 Play2.0 Enumeratee 页面显示了使用&>orthrough方法将 an 更改Enumerator[String]为的示例Enumerator[Int]

还有一个Enumeratee.groupedenumeratee 可以从单个元素创建块的枚举器。这似乎工作正常。

但我看到的是,通常的输入将采用Array[Byte](由Enumerator.fromFileand返回Enumerator.fromStream)的形式。考虑到这一点,我想将这些Array[Byte]输入转换为Enumerator[String],例如,每个字符串都是一行(以 a 结尾'\n')。线条和元素的边界Array[Byte]通常不匹配。如何编写一个可以将分块数组转换为分块字符串的枚举器?

目的是在每行可用时将这些行分块返回给浏览器Array[Byte],并保留不属于完整行的剩余字节,直到下一个输入块出现。

理想情况下,我希望有一个方法,给定 aniter: Iteratee[Array[Byte], T]和 anEnumerator[Array[Byte]]将给我一个Enumerator[T],我的 T 元素被解析iter

附加信息:我有一些时间来清理我的代码,这是我正在尝试做的一个具体示例。我有以下检测下一行的迭代器:

我想做的是这样的:

0 投票
2 回答
587 浏览

scala - play2 让 Enumeratee 将一个 Promise 转换为另一个 Promise

我正在尝试掌握在 Play 2 中使用 Iteratees 流式传输彗星结果的方法。我已经掌握了从回调创建枚举器和从地图创建枚举器的句柄。我的问题是 Enumeratee.map,这需要一个函数,该函数接受纯输入并返回纯输出(例如doc中的 String 到 Int 的转换)。我想做的是接受一个纯粹的输入并返回一个结果的承诺。毕竟,枚举器向枚举器提供承诺,枚举器将一个枚举器转换为另一个枚举器,因此应该有一种方法可以使枚举器映射到承诺。

现在,让我举一个例子来说明这一点。假设我有一个 http 请求,其中包含要在我的数据库中查询的 ID 列表。假设这些 id 表示数据库表中的行,请求对这些行执行一组(长)计算,然后返回一组表示计算的 json 对象。由于我有很长的事情要做,所以一次流式传输一个 ID 会很酷,所以我希望有一个枚举管道:

  1. 查询数据库中的一行(返回该行的承诺)
  2. 对行进行长时间计算(取一行并返回计算的承诺)
  3. 将长计算转换为 JSON
  4. &> 将此输出到 Play 2 提供的 Comet 枚举对象

1 有点简单,我可以构造一个带有 fromCallback 的枚举器,它将返回查询结果的承诺。3 也有点简单,因为它是一个简单的 Enumeratee.map

但是我无法理解如何实现步骤 2 的枚举对象的 applyOn。我可以理解我已经构建了一个新的迭代对象,它从“内部”迭代对象获得承诺,flatMap 长计算并返回新的承诺。我没有得到的是如何在给定奇怪的 applyOn 签名的情况下做到这一点:def applyOn[A](it: Iteratee[To, A]): Iteratee[From, Iteratee[To, A]]

有人可以帮我吗?

谢谢

0 投票
3 回答
2677 浏览

scala - Scala:读取 Enumerator[T] 的一些数据并返回剩余的 Enumerator[T]

我正在使用使用 Iteratees 和 Enumerators 的 playframework 的异步 I/O 库。我现在有一个 Iterator[T] 作为数据接收器(为简单起见,它是一个将其内容存储到文件中的 Iterator[Byte])。这个 Iterator[Byte] 被传递给处理写入的函数。

但是在写之前我想在文件开始处添加一些统计信息(为了简化说它是一个字节),所以在将迭代器传递给写函数之前,我以以下方式传输迭代器:

当我现在从磁盘读取存储的文件时,我得到了一个 Enumerator[Byte] 。首先,我想读取并删除附加数据,然后我想将 Enumerator[Byte] 的其余部分传递给处理读取的函数。所以我还需要改造枚举器:

但我不知道如何做到这一点。如何从枚举器中读取一些字节并获取剩余的枚举器?

将 Iteratee[Byte] 替换为 OutputStream 并将 Enumerator[Byte] 替换为 InputStream,这将非常简单:

但是我需要play框架的异步I/O。