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
这是与像 map
、filter
这样的惰性序列函数以及像 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
生成的序列元素是逐步计算得到的。这些
序列将按需逐步消耗输入并完全实现
中间操作。这种行为与惰性序列上的等效操作不同。
(着重号为我所加)
noting
由于 sequence
可以分块,因此这并不令人惊奇,但让我惊奇的是,sequence
将在没有返回结果额外调用的情况下部分实现其输入。