问题标签 [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.
performance - Haskell中的懒惰和尾递归,为什么会崩溃?
我有一个相当简单的函数来计算一个大列表的元素的平均值,使用两个累加器来保存到目前为止的总和和到目前为止的计数:
现在,用严格的语言来说,这将是尾递归的,不会有问题。然而,由于 Haskell 是懒惰的,我的谷歌搜索让我明白 (s+x) 和 (l+1) 将作为 thunk 传递给递归。所以这整个事情崩溃和燃烧:
进一步谷歌搜索后,我发现seq
和$!
. 这似乎我不明白,因为我在这种情况下使用它们的所有尝试都证明是徒劳的,错误消息说明了无限类型。
最后我找到-XBangPatterns
了,它通过改变递归调用解决了这一切:
但我对此并不满意,因为-XBangPatterns
目前是扩展。我想知道如何在不使用-XBangPatterns
. (也许也能学到一些东西!)
只是为了让您了解我的理解不足,这是我尝试过的(即编译的唯一尝试):
据我所知, seq 应该在这里强制评估 s 和 l 参数,从而避免由 thunk 引起的问题。但我仍然得到堆栈溢出。
clojure - 将此 Clojure 调用转换为惰性序列
我正在使用消息传递工具包(它恰好是Spread,但我不知道细节很重要)。从这个工具包接收消息需要一些样板文件:
- 创建与守护程序的连接。
- 加入一个小组。
- 接收一条或多条消息。
- 离开小组。
- 断开与守护程序的连接。
遵循我在其他地方看到的一些习语,我能够使用 Spread 的 Java API 和 Clojure 的互操作表单来编写一些工作函数:
(与 基本相同的习语with-open
,只是SpreadConnection
该类使用disconnect
而不是close
. Grr。此外,我在这里省略了一些与结构问题无关的宏。)
这工作得很好。我可以从结构内部调用接收消息,例如:
在我看来,receive-message
如果它是一个产生消息的无限惰性序列,使用起来会更干净。因此,如果我想加入一个群组并获取消息,调用代码应如下所示:
我见过很多没有清理的惰性序列的例子,这并不难。问题是上面的第 4 步和第 5 步:离开组并与守护程序断开连接。如何将连接状态和组绑定到序列中,并在不再需要序列时运行必要的清理代码?
stream - Ocaml:惰性列表
如何制作一个表示一系列倍数的惰性列表?例子:
clojure - 如何在 Clojure 中将惰性序列转换为非惰性序列
我在 Clojure 中尝试了以下操作,期望返回非惰性序列的类:
但是,这仍然返回clojure.lang.LazySeq
。我的猜测是,它doall
确实评估了整个序列,但返回了原始序列,因为它仍然对记忆有用。
那么从惰性序列创建非惰性序列的惯用方法是什么?
python - Python:延迟字符串解码
我正在编写一个解析器,有很多文本要解码,但我的大多数用户只会关心所有数据中的几个字段。所以我只想在用户实际使用一些数据时进行解码。这是一个好方法吗?
这是我需要覆盖的唯一方法吗?
compiler-construction - 如何开始创建一种小型惰性求值语言的方法
我正在尝试使用 List Comprehension 和 Lambda Functions 等(已经制作)构建一种与 Java 具有相似语法和语法结构的小型语言。
我现在要做的不是让它进行急切的评估,而是让这种语言懒惰地评估表达式。我不完全确定如何去做,因为我不清楚如何进行部分评估。
我做了很多谷歌搜索并没有给出答案,所以我想知道这里是否有人对此有很好的参考。
有接盘侠吗?
c# - C# / .NET 的延迟流
有谁知道.net 中的惰性流实现?IOW,我想创建一个这样的方法:
当我的其他代码调用 MyMethod() 以返回检索流时,它实际上不会执行任何工作,直到有人真正尝试从流中读取。通常的方法是让 MyMethod 将流参数作为参数,但这在我的情况下不起作用(我想将返回的流提供给 MVC FileStreamResult)。
为了进一步解释,我正在寻找的是创建一系列分层的转换,所以
数据库结果集=(转换为)=> 字节流=(链接到)=> GZipStream =(传递到)=> FileStreamResult 构造函数。
结果集可能很大 (GB),因此我不想将结果缓存在 MemoryStream 中,我可以将其传递给 GZipStream 构造函数。相反,我想在 GZipStream 请求数据时从结果集中获取。
haskell - peekCString 和 peekCStringLen 是懒惰的吗?
我有一个 C 函数,它创建一个以空结尾的字符串并返回一个指向它的指针,还有相应的释放函数。
我想从返回的 CString 中创建一个 Haskell 字符串,并尽快释放 CString。
在使用 str 之前释放 cStr 是否安全?换句话说,peekCString 是一次性创建 Haskell String,还是懒惰地创建?
list - 是否可以与 F# 中的分解序列匹配?
我似乎记得旧版本的 F# 在匹配序列时允许结构分解,就像列表一样。有没有办法在保持序列惰性的同时使用列表语法?我希望避免大量调用 Seq.head 和 Seq.skip 1。
我希望有类似的东西:
但这仅处理列表并在使用序列时给出类型错误。使用 List.of_seq 时,它似乎评估了序列中的所有元素,即使它是无限的。
clojure - Clojure:懒惰的魔法
几乎 2 个相同的程序来生成无限的惰性随机序列。第一个不会崩溃。出现 OutOfMemoryError 异常的第二次崩溃。为什么?
但是以下崩溃很快: