问题标签 [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 投票
6 回答
9165 浏览

php - PHP 相当于 Python 的 yield 运算符

在 Python(和其他)中,您可以通过在函数中使用“yield”运算符来增量处理大量数据。在 PHP 中这样做的类似方法是什么?

例如,假设在 Python 中,如果我想读取一个可能非常大的文件,我可以像这样一次处理每一行(这个例子是人为的,因为它基本上与 'for line in file_obj '):

我现在正在做的(在 PHP 中)是我使用私有实例变量来跟踪状态,并在每次调用函数时相应地采取行动,但似乎必须有更好的方法。

0 投票
5 回答
284 浏览

c# - 在功能列表操作中,我们称之为“在每个项目之间插入一些东西”?

有时我发现我需要通过在每个项目之后插入一个新项目来处理一个列表,除了最后一个项目。类似于您在字符串列表的每个项目之间放置逗号的方式。

我厌倦了每次都为最后一个(或第一个)项目编写特殊情况,所以我在 Linq 样式的扩展中捕获了这种模式:

例如,这允许我以编程方式轻松地用超链接填充流文档,但每个链接之间都有一个换行符:

假设这在 System.Linq.Enumerable 中不存在(这是我通常在写完类似的东西后立即发现的),问题是,Separate在其他功能框架或语言中通常调用的列表上的这个操作是什么?

0 投票
4 回答
14925 浏览

nhibernate - 强制惰性实体加载真实实例

我有一个惰性实体的代理,它是通过加载子实体在会话中创建的。对父实体的后续提取仅返回 NH 代理。我需要实际的实例来检查类型(实体已加入子类)。我一定错过了一些东西,但我找不到办法做到这一点。Session.Refresh(proxy) 似乎没有帮助,我尝试过的任何 HQL 风格也没有帮助。

任何人都可以帮忙吗?

0 投票
3 回答
1310 浏览

clojure - clojure 中的递归(doall)

我有一些具有嵌套惰性序列的结构,它们从文件中读取。当我测试时,我希望能够将它们包装在 doall 的递归版本中,以确保在文件关闭之前从文件中提取所有数据。

0 投票
5 回答
1740 浏览

python - 不在 hasattr() 上评估的 Python 惰性属性

是否可以制作一个使属性变得惰性的装饰器,当您尝试使用它访问它时不会评估它hasattr()?我想出了如何让它变得懒惰,但hasattr()让它过早地评估。例如,

0 投票
2 回答
2649 浏览

haskell - 如何解决haskell中的“堆栈空间溢出”

运行以下程序将打印“空间溢出:当前大小 8388608 字节”。我已经阅读了这个这个,但仍然不知道如何解决我的问题。我正在使用foldr,不应该保证是“尾递归”吗?

到目前为止,我对 Haskell 感觉很好,直到我知道在使用强大的递归时应该防止“空间溢出”。:)

isPrime编辑:为简单起见删除定义

0 投票
4 回答
3606 浏览

haskell - (模拟)Haskell 中的宏?

Reddit 上的一个人让我注意到了这段代码:

这里发生的事情是我们有一系列操作,我们可以用它们来做一些事情,比如反向或获取它的尾部或头部。

惊人的。

我想做的是进入单个元素并永久改变它们。例如,我希望能够做这样的事情:

并得到类似 [print, 1] 的内容,然后将最后一个元素更改为 3.14,以便函数打印 3.14。

在 Haskell 中是否有可能,还是我应该回到 LISP?

一个重要的编辑:我有点失误。我了解我需要创建一个新列表。是否可以获取作为列表一部分的函数的参数?我想要的是能够从它们的标识符/参数组合函数,并且还能够在评估之前将函数分解为标识符/参数。

0 投票
2 回答
712 浏览

git - 在 git-svn rebase 之后检测冲突

我正在使用这么多 git-svn 存储库(同时),以至于更新它们变得很麻烦。我想编写一个自动化的脚本,这样我就可以每天早上在我拿咖啡的时候运行它。

基本上我的工作流程是这样的

我已经将该git svn fetch部分自动化,可以随时安全地完成。但是自动执行 git svn rebase 并不安全,因为可能存在冲突。

脚本如何确定变基后是否存在冲突?然后我可以运行 git rebase --abort,并在日志文件中写入一行,这样当我喝咖啡回来时,我可以查看失败:)

0 投票
5 回答
4739 浏览

debugging - 如何在惰性函数式编程语言中实现调试?

我想知道如何在惰性函数式语言中实现调试。
你能使用断点、打印语句和传统技术吗?这甚至是个好主意吗?
我的理解是纯函数式编程不允许副作用,除了 monad。
执行顺序也不能保证。
您是否必须为要测试的每一段代码编写一个 monad?我想从这个领域更有经验的人那里得到一些关于这个问题的见解。

0 投票
2 回答
4285 浏览

performance - 为什么在此示例中使用序列比使用列表慢得多

背景:我有一系列连续的带时间戳的数据。数据序列中有漏洞,有的很大,有的只是一个缺失值。
每当孔只是一个缺失值时,我想使用虚拟值修补孔(将忽略较大的孔)。

我想使用修补序列的延迟生成,因此我使用 Seq.unfold。

我已经制作了两个版本的方法来修补数据中的漏洞。

第一个使用带有漏洞的数据序列并生成修补序列。这就是我想要的,但是当输入序列中的元素数量超过 1000 时,这些方法的运行速度非常慢,并且输入序列包含的元素越多,情况就会变得越糟。

第二种方法使用带有漏洞的数据列表并生成修补后的序列,并且运行速度很快。然而,这不是我想要的,因为这会强制在内存中实例化整个输入列表。

我想使用 (sequence -> sequence) 方法而不是 (list -> sequence) 方法,以避免将整个输入列表同时放在内存中。

问题:

1)为什么第一种方法这么慢(随着更大的输入列表变得越来越糟)(我怀疑它与使用 Seq.skip 1 重复创建新序列有关,但我不确定)

2)如何在使用输入序列而不是输入列表的同时快速修补数据中的漏洞?

编码: