问题标签 [lazy-sequences]

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 回答
340 浏览

clojure - clojure 中何时实现惰性序列的不同元素?

我试图了解 clojure 的惰性序列何时是惰性的,何时发生工作,以及我如何影响这些事情。

我希望在这里只看到两个“fn call!”。有没有办法管理它?无论如何,继续进行毫无疑问只需要一次评估的事情:

first适合惰性序列?

在这一点上,我完全不知道如何访问我的玩具 lz-seq 的开头而不必了解整个事情。这是怎么回事?

0 投票
1 回答
285 浏览

clojure - 懒惰和stackoverflow

我写了以下内容:

解决 4clojure.com 的问题 #118:http ://www.4clojure.com/problem/118

它要求在不使用map等的情况下重新实现map并且该解决方案通过了测试(我不知道它是否正确:它非常接近所说的其他解决方案)。

因为问题表明它必须是惰性的,所以我通过将我的解决方案“包装”在惰性序列中来编写上面的代码......但是我不明白惰性序列是如何工作的。

我不明白这里的“懒惰”是什么,也不明白如何测试它。

当我问(type ...)我时,不出所料,我得到了一个clojure.lang.LazySeq但我不知道这与我简单地删除惰性序列“包装”有什么区别。

当然,如果我删除lazy-seq,我会得到一个stackoverflow,为什么要尝试执行这个:

否则(即:如果我让惰性序列包装到位),它似乎工作正常。

所以我决定尝试以某种方式“调试”/跟踪正在发生的事情,以试图了解它是如何工作的。我采用了以下宏(我在 SO IIRC 上找到的):

并将工作版本包装在dbg宏中并尝试再次执行它。现在kaboom:运行良好的版本现在也抛出了stackoverflow。

现在我不确定:也许这是宏的不良影响,会以某种方式强制评估否则不会被评估的东西?

如果有人能解释一下,使用这个简单的函数和简单的测试,懒惰在这里是如何工作的,什么时候被调用等等,那就太好了。

0 投票
3 回答
187 浏览

python - 聪明的基于流的python程序不会遇到无限递归

我正在玩一些聪明的方法来为序列A003602创建一个 python 生成器

这似乎有效,但我不知道为什么。在我看来,它应该达到无限递归。python 是否在我不认识的地方进行了一些惰性评估?

对我来说,似乎因为 RZ 立即调用 interleave 返回的方法,而后者又调用了 RZ 的 b(在第一次调用 yield 之前),这应该是无限递归。但这实际上似乎有效。谁能解释为什么?

0 投票
2 回答
321 浏览

python - 是否有用于处理复杂数学集的 Python 库(使用数学集构建器符号构建)?

我经常使用多维数组,其数组索引是从复杂的用户指定的集合中生成的。

我正在寻找一个库,其中包含用于表示具有任意数量索引和任意复杂谓词的复杂集合的类。给定一个集合描述,期望的输出将是一个生成器。该生成器将依次生成对应于多维数组索引的dicts 或s。tuple

有这样的图书馆吗?


例子

假设我们有以下用户指定的集合(在set-builder notation 中),它表示某个数组变量的索引x[i][j]

{i 在 1..100, j 在 1..50: i >= 20, j >= 21, 2*(i + j) <= 100}

我想将它放入某种惰性类(可能是生成器表达式)中,这将允许我惰性地评估集合的元素以生成我的数组的索引。假设这个类被调用lazyset;这将是期望的行为:

我想我可以使用生成器表达式自己动手,但这似乎是一个已解决的问题。所以我想我会问是否有人遇到过处理这个问题的成熟图书馆(至少在某种程度上)。有这样的图书馆吗?

0 投票
3 回答
253 浏览

clojure - 这个clojure prime seq有什么问题?

我不明白为什么这个惰性素数序列的定义会导致不终止。我得到的堆栈跟踪不是很有帮助(我对 clojure 的一个抱怨是钝的堆栈跟踪)。

0 投票
1 回答
655 浏览

clojure - 一个简单的惰性序列上的doseq用完了堆空间

在对工作中的某些 Clojure 代码进行压力测试时,我注意到它在迭代大型数据集时会耗尽堆空间。我最终设法将问题追溯到 Clojure 的doseq函数和惰性序列的实现的组合。

这是通过耗尽可用堆空间使 Clojure 崩溃的最小代码片段:

文档doseq明确指出它不保留惰性序列的头部,因此我希望上述代码的内存复杂度接近 O(1)。有什么我想念的吗?doseq如果不能胜任这项工作,那么迭代超大惰性序列的 Clojure 惯用方式是什么?

0 投票
3 回答
1691 浏览

string - 在 Clojure 中加入多个惰性字符串序列

我有几个字符串:

现在我想连接它们的一部分来创建一个字符串“一些文本”。不幸的是,下面的两个字符串都不起作用。

这是因为函数taketake-last返回惰性序列。问题是:连接多个惰性字符串序列并返回一个字符串的正确方法是什么?

编辑:我找到了一种解决方案——(apply str (concat (take 4 a) " " (take-last 4 a)))但它是最正确的方法吗?

0 投票
1 回答
1059 浏览

clojure - 如何创建惰性序列向量

运行它按预期工作:

但是我想对向量做同样的事情:

这给了我一个堆栈溢出。为什么?

0 投票
3 回答
2626 浏览

clojure - 在 Clojure 中,惰性 seq 总是分块吗?

我的印象是惰性序列总是被分块的。

正如预期的那样,打印了 32 个点,因为返回的惰性序列range被分块为 32 个元素块。但是,当range我不是用自己的函数尝试这个时get-rss-feeds,惰性序列不再被分块:

只打印了一个点,所以我猜返回的lazy-seqget-rss-feeds没有​​分块。确实:

这是来源get-rss-feeds

因此,chunkiness 似乎取决于惰性 seq 的产生方式。我查看了该函数的源代码,range并且有迹象表明它是以“矮胖”的方式实现的。所以我有点困惑这是如何工作的。有人可以澄清一下吗?


这就是我需要知道的原因。

我必须遵循代码:(get-rss-entry (get-rss-feeds h-res) url)

调用get-rss-feeds返回我需要检查的提要的惰性 URL 序列。

调用get-rss-entry查找特定条目(其 :link 字段与 get-rss-entry 的第二个参数匹配)。它检查由返回的惰性序列get-rss-feeds。评估每个项目需要跨网络的 http 请求来获取新的 rss 提要。为了最大限度地减少 http 请求的数量,重要的是要逐个检查序列并在匹配时立即停止。

这是代码:

entry-with-url如果没有匹配,则返回惰性匹配序列或空序列。

我对此进行了测试,它似乎可以正常工作(一次评估一个提要网址)。但我担心在某个地方,它会以某种“笨重”的方式开始表现,它会开始一次评估 32 个提要。我知道有一种方法可以避免此处讨论的笨拙行为,但在这种情况下似乎甚至不需要。

我是否以非惯用方式使用惰性序列?循环/重复会是更好的选择吗?

0 投票
11 回答
2785 浏览

f# - 如何在 F# 中执行 Seq.takeWhile + 一项

我想编写一个函数,它使用谓词过滤序列,但结果还应该包括谓词返回 false 的第一项。

如果在 F# 中有一个 break 关键字,逻辑将是这样的

我尝试了 Seq.takeWhile 和 Seq.skipWhile 的组合,如下所示:

...但问题是与谓词匹配的第一项在 takeWhile 和 skipWhile 之间丢失

另请注意,输入序列是惰性的,因此任何消耗该序列并随后做出决定的解决方案都是不可行的。

有任何想法吗?

谢谢!

编辑:非常感谢所有的答案!没想到这么快就有这么多回复。我很快就会看看他们中的每一个。现在我只想提供更多背景信息。考虑以下实现 shell 的编码 kata:

这个实现的问题是它打印“再见!” 输入命令 q 时。

我想要做的是实现函数processUntilQuit以便它处理直到“q”的所有命令,包括“q”。