请在 2024年Clojure状态调查!(调查问卷) 分享您的想法。

欢迎!请参阅 关于 页面以获取更多关于如何使用本网站的信息。

+2
序列
重新标记

sequence 的文档字符串说明

  • "... 不会强制懒序列..."
  • "... 返回一个懒序列..."

基于此,我本以为 sequence(单独使用)不会导致其任何输入被消耗。不清楚这是否为预期行为,但原文可能可以调整以表明 sequence 会部分实现其输入。

(do
  (->> (range 1000)
       (map #(doto % prn))
       (sequence (map inc)))
  nil)

打印以下内容到标准输出

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

这与像 mapfilter 这样的懒序列函数以及如 eduction 这样延迟选型的选项不同。以下表达式不会打印任何内容到标准输出

(do
  (->> (range 1000)
       (map #(doto % prn))
       (eduction (map inc)))
  nil)

(do
  (->> (range 1000)
       (map #(doto % prn))
       (map inc))
  nil)

另一个参考也暗示 sequence(单独使用)不会消耗任何输入,https://clojure.org/reference/transducers#_sequence

结果序列元素是逐步计算的。这些
序列将以**按需**的方式逐步消耗输入,并完全实现中间操作。这种行为与懒序列的等效操作不同。
操作。
(重点是我自己划的)

并不令人惊讶的是,sequence 可以分块,但对我不惊讶的是,sequence 会在没有对返回结果进行额外调用的情况下部分实现其输入。

2 答案

+2

被选中
 
最佳答案

当使用 sequence 的转接阶数时,它会在 N 个源上创建一个转换迭代器(sequence 是唯一可以访问的那个)。然后通过 RT.chunkIteratorSeq() 包裹成一个 seq - 这是强制第一个元素确定是否需要返回 nil 或序列的方法。

没有回顾旧笔记,我不记得这是否是我们考虑过并决定不重要的事项,或者这是一项遗漏和应该被纠正的事项。我同意你的观点,该行为似乎与 docstring 的描述不一致。

可能已经有相关工单,我还没有查看。

+2
...