问题标签 [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 回答
3622 浏览

haskell - iteratee的介绍或简单示例?

我发现 Oleg 在 Iteratee 上的文档有点难以理解。特别是因为他在 Haskell-Cafe 的帖子中的一些函数不在 iteratee 库中(如enum_file)。

是否有一个很好的关于 iteratee 的介绍,包括打开文件/套接字、读取和处理数据等基础知识。

0 投票
1 回答
303 浏览

haskell - 无法完成此枚举对象

有一次,我在 haskell 中编写了一个数据包捕获程序,它使用惰性 IO 捕获所有 tcp 数据包。问题是有时数据包是无序的,所以我必须将它们全部插入一个列表,直到我得到一个 fin 标志,以确保我拥有对它们做任何事情所需的所有数据包,如果我正在嗅探某些东西真的很大,就像一个视频,我不得不记住所有这些。要做到这一点,任何其他方式都需要一些困难的命令式代码。

所以后来我了解了迭代器,我决定实现自己的。它是如何工作的,有一个枚举对象。您向它提供您希望它保存的数据包数量。当它拉入数据包时,它会对它们进行排序,然后一旦达到您指定的数量,它就会开始刷新,但会在其中留下一些,以便在刷新更多数据包之前将新块排序到该列表中。这个想法是,在遇到这个枚举对象之前,块几乎是有序的,它将解决大多数小订单问题。当它收到 EOF 时,它应该将所有剩余的数据包发送回去。

所以它几乎可以工作。我意识到其中一些可以被标准枚举器函数替换,但我想自己编写它们以了解它如何更好地工作。这是一些代码:

Readlines 只是一次一行地从文件中获取行并提供它。PrintLines 只打印每个块。numbers.txt 是一组以行分隔的数字,它们的顺序有点乱,有些数字应该是前面或后面的几个空格。Reorder 是一个函数,它保存 n 个数字并将新的数字排序到其累加器列表中,然后将除最后 n 个数字之外的所有数字推出。

我的问题是未定义的重新排序。发生的情况是 reorder 有 10 个项目卡在其中,然后它从堆栈中接收到 EOF。所以它去了 k (Chunks those10items) 然后有一个未定义的,因为我不知道放在这里让它工作。

发生的情况是最后 10 项从程序的输出中删除。您可以看到跟踪,该变量 buf 包含所有剩余的项目。我尝试过让步,但我不确定该让步或是否应该让步。我不确定要放什么来完成这项工作。

编辑:原来通过将循环的未定义部分更改为:

我几乎肯定曾经有过,但我没有得到正确的答案,所以我认为这是错误的。

问题出在 printLines 上。由于 reorder 一次发送一个块,直到它到达最后,我从未注意到 printLines 的问题,即它在每个循环中丢弃了除第一个块之外的块。在我的脑海中,我认为这些大块会结转或其他什么,这很愚蠢。

无论如何,我将 printLines 更改为:

现在它可以工作了。非常感谢,我怕我得不到答案。

0 投票
2 回答
191 浏览

haskell - 您如何使用 iteratee 库的最新版本(撰写本文时为 0.8.1.2)?

我已经阅读了关于迭代器和枚举器概念的教程,并实现了一个示例版本作为学习它们如何工作的一种方式。但是,iteratee 包中使用的类型与我找到的任何教程都非常不同。例如,Iteratee定义为:

我真的不明白我的意思是这样做。是否有任何关于使用此版本的教程,以及为什么以这种方式编写(即这与 Oleg 的原始方式相比有什么好处)。

0 投票
1 回答
320 浏览

haskell - 过滤/分支枚举

我正在使用enumerator-0.4.10,我需要将传入流的不同部分的处理分配给不同的迭代(我正在解析一个巨大的XML文件,不同的子树有不同的处理逻辑)。由于子树不相交,因此一次只有一个迭代者处于活动状态。

我写了一个简单的例子,过滤流并将结果传递给一个迭代器;请看下文。但是,对于多个嵌套的迭代器,在我看来,我不能再使用枚举器了。我是否需要编写自己的包含多个内部迭代器的多枚举器?有更好的想法吗?

这是我的(初学者)单个嵌套迭代的代码:

0 投票
1 回答
1140 浏览

haskell - Attoparsec Iteratee

我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我有一个简单的例子,它能够解析文件中的一行。我的解析器一次读取一行,所以我需要一种向迭代器提供行的方法,直到它完成。我已经阅读了我在谷歌上搜索到的所有内容,但是很多关于 iteratee/enumerators 的材料都非常先进。这是重要的代码部分:

此示例将解析并打印多行文件中的一行。原始脚本将解析器映射到 ByteStrings 列表。所以我想在这里做同样的事情。我enumLines在 Iteratee 中找到了,但我终生无法弄清楚如何使用它。也许我误解了它的目的?

0 投票
1 回答
936 浏览

haskell - Haskell iteratee:去除尾随空格的简单示例

我试图了解如何将 iteratee 库与 Haskell 一起使用。到目前为止,我所看到的所有文章似乎都专注于建立一种关于如何构建迭代器的直觉,这很有帮助,但现在我想深入了解并实际使用它们,我觉得有点不知所措。查看 iteratees 的源代码对我来说价值有限。

假设我有这个函数可以从一行中修剪尾随空格:

我想做的是:将它变成一个迭代器,读取一个文件并将其写在其他地方,并从每行中去除尾随空格。我将如何使用迭代器构建它?我看到enumLinesBSData.Iteratee.Char 中有一个函数,我可以深入了解它,但我不知道是否应该使用mapChunksconvStream如何将上面的函数重新打包成一个 iteratee。

0 投票
1 回答
309 浏览

haskell - 嵌套迭代器

我正在使用一个特定的数据库,在成功查询后,您可以使用特定命令访问一组结果数据块:

现在 getResultData 将返回一个响应代码和一些数据,其中响应代码如下所示:

ByteString 是一个、一些或所有块:

数据 http://desmond.imageshack.us/Himg189/scaled.php?server=189&filename=chunksjpeg.png&res=medium

故事并没有到此结束。存在一个组流:

串流 http://desmond.imageshack.us/Himg695/scaled.php?server=695&filename=chunkgroupsjpeg.png&res=medium

一旦收到来自 getResultData 的 NO_MORE_DATA 响应,对 getNextItem 的调用将迭代流,允许我再次开始调用 getResultData。一旦 getNextItem 返回 STREAM_FINISHED,这就是她写的全部内容;我有我的数据。

现在,我希望使用 Date.Iteratee 或 Data.Enumerator 来重塑这种现象。就我现有的 Data.Iteratee 解决方案而言,它似乎非常幼稚,我觉得我应该使用嵌套的 iteratee 进行建模,而不是一个大的 iteratee blob,这是我的解决方案目前的实现方式。

我一直在看 Data.Iteratee 0.8.6.2 的代码,当谈到嵌套的东西时我有点困惑。

嵌套迭代是正确的行动方案吗?如果是这样,如何用嵌套的迭代来建模呢?

问候

0 投票
1 回答
311 浏览

haskell - 为什么http-enumerator中的`http`是Iteratee?

的类型签名http是:

为什么不是这个呢?

如果我理解正确的话, anIteratee x m a就像一个单子解析器,它消耗一个类型的项目流xhttp将' 回调设为 是有意义的Iteratee,因为它消耗响应体。

但是,http它本身似乎不消耗任何输入。httpLbs函数使用(在Data.Enumerator中定义)执行。据我所知,如果给它的 iteratee 需要输入,则认为这是一个错误:httprun_run

那么如果http不消耗输入,为什么它是一个迭代器呢?为什么不只是一个MonadIO动作?

0 投票
2 回答
282 浏览

haskell - 结合两个枚举

我试图绕着enumerator图书馆转,遇到了一种情况,我想根据两个现有的 Enumeratee 构建一个新的 Enumeratee。假设我有枚举对象:

我觉得我应该能够将它们组合成一个枚举对象

但我在包中找不到执行此操作的现有函数。我尝试自己编写这样的函数,但我对迭代对象的理解仍然非常有限,以至于我无法找到一种方法来让所有复杂类型都匹配。

我只是错过了一些基本的组合器,还是 Enumeratees 甚至应该可以相互组合?

0 投票
2 回答
387 浏览

haskell - 如果 Enumerator 尝试使用输入会发生什么?

的定义Enumerator是:

该文档指出,虽然Iteratees 消费数据,Enumerator但 s 生产它。我可以理解如何使用这种类型生成数据:

enumEOF比这更复杂......它显然会检查以确保在被给予之后没有Iteratee,如果是则抛出错误。)ContinueEOF

即, an在运行时Iteratee会产生 a 。然后将其馈送到我的枚举器,它为它提供 a以便它可以继续。我的枚举器返回结果延续。SteprunIterateeStepStream

有一件事让我印象深刻:这段代码在Iterateemonad 中运行。这意味着它可以消耗数据,对吧?

该文档指出,当枚举器同时充当源和接收器时,Enumeratee应改为使用:

但是,显然我不必这样做;Enumerator正如我的enumStreamWeird函数所示,我可以在 an 的定义中使用输入。

我的问题是:

  • 如果您尝试在 中“使用”数据,会发生什么Enumerator情况enumStreamWeird?数据从何而来?

  • 即使我们没有足够疯狂地使用枚举器中的数据,代表枚举器而不是代表迭代器读取我们正在生成的数据在底层 monad 中执行操作是否有效?

后一个问题可能与我的主要问题不太相关,但我试图了解 anEnumerator它是如何做的。