gpt4 book ai didi

clojure - 对无限序列使用doseq/for

转载 作者:行者123 更新时间:2023-12-04 13:31:21 24 4
gpt4 key购买 nike

在Clojure中,可以通过函数for或类似地使用doseq来遍历序列,以获取副作用,并获得nil作为返回值:

(doseq [x (range 3)]
(prn x))

; 0
; 1
; 2

对于序列是无限的情况,有一种引入中断条件的方法:
(doseq [x (range) :while (< x 3)]
(prn x))

这将产生与上述相同的输出。

作为一项专业,当您使用多个序列时,会有一种非常有趣的行为。正如文档所称:“以嵌套方式迭代集合,最右边最快”。
(doseq [x (range 3) y (range 3)]
(prn x y))

; 0 0
; 0 1
; 0 2
; 1 0
; 1 1
; 1 2
; 2 0
; 2 1
; 2 2

但是,如果序列再次变为无限,会发生什么情况。当最后一个无穷大时,它工作得很好。这将与之前的示例一样工作:
(doseq [x (range 3) y (range) :while (< y 3)]
(prn x y))

如果第一个是无限的,则结果输出将如预期的那样,但是由于某些原因,在最后一行打印之后循环不会停止。换句话说:repl继续工作。
(doseq [x (range) y (range 3) :while (< x 3)]
(prn x y))

有人可以解释这种行为吗?

最佳答案

这没有道理:

(doseq [x (range) 
y (range 3)
:while (< x 3)]
(prn x y))

它应该是:
(doseq [x (range) 
:while (< x 3)
y (range 3)]
(prn x y))

...终止。

这样想:
(doseq [x (range)]
(doseq [y (range 3)
:while (< x 3)]
(prn x y)))

vs:
(doseq [x (range)
:while (< x 3)]
(doseq [y (range 3)]
(prn x y)))

在原始版本中,外部循环是无限的,内部循环中的 :while没有任何区别。循环继续进行,它什么也不做。在固定版本中, :while终止外部循环。

关于clojure - 对无限序列使用doseq/for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com