问题标签 [lazy-evaluation]

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 投票
3 回答
3358 浏览

performance - Haskell中的懒惰和尾递归,为什么会崩溃?

我有一个相当简单的函数来计算一个大列表的元素的平均值,使用两个累加器来保存到目前为止的总和和到目前为止的计数:

现在,用严格的语言来说,这将是尾递归的,不会有问题。然而,由于 Haskell 是懒惰的,我的谷歌搜索让我明白 (s+x) 和 (l+1) 将作为 thunk 传递给递归。所以这整个事情崩溃和燃烧:

进一步谷歌搜索后,我发现seq$!. 这似乎我不明白,因为我在这种情况下使用它们的所有尝试都证明是徒劳的,错误消息说明了无限类型。

最后我找到-XBangPatterns了,它通过改变递归调用解决了这一切:

但我对此并不满意,因为-XBangPatterns目前是扩展。我想知道如何在不使用-XBangPatterns. (也许也能学到一些东西!)

只是为了让您了解我的理解不足,这是我尝试过的(即编译的唯一尝试):

据我所知, seq 应该在这里强制评估 s 和 l 参数,从而避免由 thunk 引起的问题。但我仍然得到堆栈溢出。

0 投票
2 回答
1072 浏览

clojure - 将此 Clojure 调用转换为惰性序列

我正在使用消息传递工具包(它恰好是Spread,但我不知道细节很重要)。从这个工具包接收消息需要一些样板文件:

  1. 创建与守护程序的连接。
  2. 加入一个小组。
  3. 接收一条或多条消息。
  4. 离开小组。
  5. 断开与守护程序的连接。

遵循我在其他地方看到的一些习语,我能够使用 Spread 的 Java API 和 Clojure 的互操作表单来编写一些工作函数:

(与 基本相同的习语with-open,只是SpreadConnection该类使用disconnect而不是close. Grr。此外,我在这里省略了一些与结构问题无关的宏。)

这工作得很好。我可以从结构内部调用接收消息,例如:

在我看来,receive-message如果它是一个产生消息的无限惰性序列,使用起来会更干净。因此,如果我想加入一个群组并获取消息,调用代码应如下所示:

我见过很多没有清理的惰性序列的例子,这并不难。问题是上面的第 4 步和第 5 步:离开组并与守护程序断开连接。如何将连接状态和组绑定到序列中,并在不再需要序列时运行必要的清理代码?

0 投票
4 回答
5757 浏览

stream - Ocaml:惰性列表

如何制作一个表示一系列倍数的惰性列表?例子:

0 投票
5 回答
46618 浏览

clojure - 如何在 Clojure 中将惰性序列转换为非惰性序列

我在 Clojure 中尝试了以下操作,期望返回非惰性序列的类:

但是,这仍然返回clojure.lang.LazySeq。我的猜测是,它doall确实评估了整个序列,但返回了原始序列,因为它仍然对记忆有用。

那么从惰性序列创建非惰性序列的惯用方法是什么?

0 投票
5 回答
2225 浏览

python - Python:延迟字符串解码

我正在编写一个解析器,有很多文本要解码,但我的大多数用户只会关心所有数据中的几个字段。所以我只想在用户实际使用一些数据时进行解码。这是一个好方法吗?

这是我需要覆盖的唯一方法吗?

0 投票
2 回答
80 浏览

compiler-construction - 如何开始创建一种小型惰性求值语言的方法

我正在尝试使用 List Comprehension 和 Lambda Functions 等(已经制作)构建一种与 Java 具有相似语法和语法结构的小型语言。

我现在要做的不是让它进行急切的评估,而是让这种语言懒惰地评估表达式。我不完全确定如何去做,因为我不清楚如何进行部分评估。

我做了很多谷歌搜索并没有给出答案,所以我想知道这里是否有人对此有很好的参考。

有接盘侠吗?

0 投票
3 回答
4014 浏览

c# - C# / .NET 的延迟流

有谁知道.net 中的惰性流实现?IOW,我想创建一个这样的方法:

当我的其他代码调用 MyMethod() 以返回检索流时,它实际上不会执行任何工作,直到有人真正尝试从流中读取。通常的方法是让 MyMethod 将流参数作为参数,但这在我的情况下不起作用(我想将返回的流提供给 MVC FileStreamResult)。

为了进一步解释,我正在寻找的是创建一系列分层的转换,所以

数据库结果集=(转换为)=> 字节流=(链接到)=> GZipStream =(传递到)=> FileStreamResult 构造函数。

结果集可能很大 (GB),因此我不想将结果缓存在 MemoryStream 中,我可以将其传递给 GZipStream 构造函数。相反,我想在 GZipStream 请求数据时从结果集中获取。

0 投票
1 回答
294 浏览

haskell - peekCString 和 peekCStringLen 是懒惰的吗?

我有一个 C 函数,它创建一个以空结尾的字符串并返回一个指向它的指针,还有相应的释放函数。

我想从返回的 CString 中创建一个 Haskell 字符串,并尽快释放 CString。

在使用 str 之前释放 cStr 是否安全?换句话说,peekCString 是一次性创建 Haskell String,还是懒惰地创建?

0 投票
3 回答
7565 浏览

list - 是否可以与 F# 中的分解序列匹配?

我似乎记得旧版本的 F# 在匹配序列时允许结构分解,就像列表一样。有没有办法在保持序列惰性的同时使用列表语法?我希望避免大量调用 Seq.head 和 Seq.skip 1。

我希望有类似的东西:

但这仅处理列表并在使用序列时给出类型错误。使用 List.of_seq 时,它似乎评估了序列中的所有元素,即使它是无限的。

0 投票
1 回答
1006 浏览

clojure - Clojure:懒惰的魔法

几乎 2 个相同的程序来生成无限的惰性随机序列。第一个不会崩溃。出现 OutOfMemoryError 异常的第二次崩溃。为什么?

但是以下崩溃很快: