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

rust - Rust 中的延迟序列生成

如何创建其他语言称为惰性序列或“生成器”函数的东西?

在 Python 中,我可以使用yield以下示例(来自 Python 的文档)来懒惰地生成一个可迭代的序列,该序列不使用中间列表的内存:

我怎样才能在 Rust 中做类似的事情?

0 投票
2 回答
6357 浏览

clojure - 从clojure中的序列中获取元素

我知道 Clojure 中的列表和向量在大多数情况下几乎可以互换使用。这是一个让我惊讶的简单案例

会谈的文档get映射一个键,但它适用于向量或集合就好了。nth甚至提到的文档,get仅在边缘情况下谈论它们的差异。

我遇到这种奇怪行为的实际情况是我加载了一个 yaml 文件。它导致了地图和列表的嵌套结构。我想用get-in.

它不起作用,因为在内部get-in使用get。所以我有一个理论和实际的问题:

  • 这种行为被get认为是正确的和预期的吗?如果是这样,请解释原因。
  • 如何访问这种地图和列表结构中的嵌套元素?
0 投票
1 回答
390 浏览

clojure - 如何展平和懒惰地连接列表列表

我正在玩懒惰的列表,似乎无法弄清楚这一点。我想我可以通过把它写成一个可以完成所有必要的大递归函数来解决我的问题,但我想用更简单的函数来组合它。

我将尝试编写一个简单的示例,该示例应该可以轻松地转化为我的问题:

所以,我们有两个功能。一个返回一个惰性数字序列。另一个返回它的数字参数 n 次(希望它也是懒惰的;如果不是这样,写一个似乎很容易)。

我想以返回惰性结果序列的方式将重复 n 映射到数字。我玩过一些lazy-seq, lazy-cat,concat和递归函数,但我仍然遇到问题。

该功能应该是这样的

和(希望)调用的结果

将会

有任何想法吗?

0 投票
1 回答
128 浏览

macros - 在宏定义中感到困惑

我想在 SICP 3.5.1 节中实现惰性流

首先,我定义了这两个函数

当我们打电话时:

所以这行得通。然后我继续定义'stream-cons',但这一次似乎有两种方法:

我不认为他们是不同的,但我错了!第一版,这是一个错误的版本,当调用时:

和第二版,这是正确的,当被称为:

现在,我很困惑。谁能帮我弄清楚两者的不同之处?非常感谢!

我的环境:Windows 32 位,SBCL 1.1.4

0 投票
1 回答
441 浏览

clojure - 我可以逐步处理未实现的惰性序列吗

我有一个惰性序列,其中每个项目都需要一些时间来计算:

是否可以逐步评估此序列并打印结果。当我尝试使用fordoseqclojure 处理它时,总是会在打印出任何内容之前实现整个惰性序列:

这两个表达式都将等待 10 秒,然后再打印出任何内容。我已经将 doall 和 dorun 视为一种解决方案,但它们要求惰性序列生成函数包含 println。我想分别定义一个惰性序列生成函数和惰性序列打印函数,并让它们逐项一起工作。

尝试这样做的动机:我有来自网络的消息,我想在收到所有消息之前开始处理它们。同时,将与查询对应的所有消息保存在惰性序列中会很好。

编辑1:

JohnJ 的回答展示了如何创建一个将逐步评估的惰性序列。我想知道如何逐步评估任何惰性序列。

我很困惑,因为(chunked-seq? (gen-lazy-seq 10))在上面定义的 gen-lazy-seq 或 JohnJ 的答案中定义的运行都返回 false。因此,问题不可能是一个创建分块序列而另一个没有。

这个答案中,显示了一个函数 seq1,它将分块的惰性序列转换为非分块的序列。尝试该功能仍然会出现延迟输出的相同问题。我认为延迟可能与 repl 中的某种缓冲有关,所以我也尝试打印 seq 中每个项目的实现时间:

使用 JohnJ 的 gen-lazy-seq 版本做同样的事情可以按预期工作

编辑2:

不仅仅是生成的序列有这个问题。无论 seq1 包装如何,使用 map 生成的这个序列都无法逐步处理:

但是这个序列,也是用地图作品创建的:

0 投票
1 回答
1879 浏览

clojure - Clojure:从输入流创建一个惰性的字节块序列

给定一个输入流,我想以字节数组(块)的形式创建一个惰性数据序列。这是我的尝试:

在最后一个语句中,我正在测试代码,我得到:

IOException 流已关闭 java.io.FileInputStream.readBytes (FileInputStream.java:-2)

如果我将语句更改为 atake 1那么它返回正常,但这对我没有多大帮助。有谁知道为什么这不起作用?

0 投票
1 回答
1408 浏览

functional-programming - node.js fs.readdir 异步递归目录搜索的懒惰评估/流/FRP代码

我尝试使用 node.js 实现一个读取 FileSystem 目录树的列表结构

目录/文件结构:

-> 列表结构:

因此,例如,给定的 UNIX 根目录:

相当于一个列表:


话虽如此,我想用一些惰性异步序列(流/无限列表?)来实现这段代码。

node.js fs.readdir 递归目录搜索 是一个很好的参考。

node.js 有很多优秀的库,例如file.walk等,但这是一个非常有趣的主题,实际上存在很多代码示例。

换句话说,学习惰性异步序列(流/无限列表?)的基本概念的好主题,并且代码可以是一个很好的库,我想从头开始实现。



substack/stream-handbook涵盖了如何使用编写 node.js 程序的基础知识。真正优秀的文章。


所以,这是我对这个主题的想法 - 递归目录树处理:

  • 本主题涉及递归搜索,有两种方式:asyncsync,由于各种原因,我选择了async方法。

  • 搜索结果相当于一个列表结构,其中函数式编程 范式确实很重要(Lisp/Scheme)。

  • 对于 JavaScript 函数式编程,有诸如underscore.js之类的库,最近,lazy.js有一个重要区别:惰性求值(也称为延迟执行)似乎优于 underscore.js

  • lazy.js 也在 Node.js 中封装了流处理。我还发现stream.js说:无限数量的元素。他们的力量来自于被懒惰的评估,简单来说就是他们可以包含无限的物品。.

  • 流数据(无限列表)实现反应式函数式编程(FRP)范式。lazy.js 实际上演示了一个鼠标事件 FRP 实现。RxJS是一个 FRP 库:RxJS 或 Reactive Extensions for JavaScript 是一个用于转换、组合和查询数据流的库。

  • 此主题的异步方法FRP主题。

  • 因此,惰性求值是函数式编程更快处理列表的核心因素,并将列表扩展为无限列表(流),将异步/事件集成到流数据源以在函数式编程范式(FunctionalReactiveProgramming)中进行处理。

  • node-lazy简介明确指出:当您需要将事件流视为列表时,Lazy 非常方便。目前最好的用例是从异步函数返回一个惰性列表,并通过事件将数据泵入其中。在异步编程中,您不能只返回一个常规列表,因为您还没有数据。到目前为止,通常的解决方案是提供一个在数据可用时调用的回调。但是这样做会失去链接函数和创建管道的能力,这会导致接口不那么好。(请参阅下面的第二个示例,了解它如何改进我的一个模块中的界面。)


最后,这是我关于这个主题的问题 - 递归目录树处理:

是否有任何示例代码可以专门以惰性评估或 FRP 方式实现此主题?

我知道lazy.js、stream.js 或linq.js 是基于惰性评估的,但它们中的任何一个都不能将node.js fs.readdir 定义为异步处理(FRP)的流数据。根据http://danieltao.com/lazy.js/docs/AsyncSequence.html,它还没有实现,对吗?

RxJS可能可以,但我不知道如何。

谷歌rx.Observable fs.readdir什么也没打。

有任何想法吗?

0 投票
2 回答
843 浏览

clojure - Clojure 中 codata 的术语示例

想象一下在 Clojure 中给出一个无限惰性斐波那契序列的函数:

假设

  1. 我们将 codata 的简洁定义视为“Codata 是由可能是无限的值所占据的类型”。
  2. 这个 Clojure 示例不使用静态类型系统(来自 core.typed),因此任何对 codata 的描述都是“工作定义”

我的问题是 - 上面函数的哪一部分是“codata”。是匿名函数吗?是惰性序列吗?

0 投票
3 回答
153 浏览

clojure - Clojure惰性序列,其中序列从两端增长

我编写了一个函数(如下所列),该函数返回一个函数,该函数从注释中定义的无限集中返回 n 个项目。

为了阐明函数的行为,我将包含测试代码(全部通过)。

不过,我真正想要的是让'range-right-left'返回一个惰性序列而不是一个函数。换句话说,而不是这样做:

我希望能够做到:

惰性序列严格从左到右增长似乎是默认行为。我试图开发一个可以双向增长的惰性序列,但无济于事。我非常感谢这样做的建议。

0 投票
1 回答
176 浏览

clojure - 为什么这个循环函数比 map 慢?

我查看了基本上不断创建惰性序列的地图源代码。我认为迭代集合并添加到瞬态向量会更快,但显然不是。我对 clojures 性能行为有什么不了解的地方?