clojure - 使用 for 列表推导会返回意外结果

标签 clojure list-comprehension

所以我试试这个代码

(for [x (range 1 8) y (range 1 8) :while (and (< x y) (even? x))] [x y])

然后回来 ()

但我试试这个:
(for [x (range 1 8) y (range 1 8) :while (and (< y x) (even? x))] [x y])

我得到了想要的结果。
改变 x 和 y 的位置有什么影响?第一个片段不应该返回一个空列表..毕竟必须有一些甚至 x 小于 y

最佳答案

在 Clojure 中,(for [x (range 1 8) y (range 1 8)] [x y])返回 x 的笛卡尔积和 yy1 运行至 7对于 x 的每次迭代.

从回复:

user=> (for [x (range 1 8) y (range 1 8)] [x y])
([1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [1 7] [2 1] [2 2] [2 3] [2 4] [2 5] [2 6] [2 7] [3 1] [3 2] [3 3] [3 4] [3 5] [3 6] [3 7] [4 1] [4 2] [4 3] [4 4] [4 5] [4 6] [4 7] [5 1] [5 2] [5 3] [5 4] [5 5] [5 6] [5 7] [6 1] [6 2] [6 3] [6 4] [6 5] [6 6] [6 7] [7 1] [7 2] [7 3] [7 4] [7 5] [7 6] [7 7])

在您的示例中,:whiley 相关联而不是 x .所以:while适用于 y 的每次迭代然后在 x 的下一次迭代后重新启动.

为了更清楚地说明这一点,请注意您还可以关联 :whilex :
user=> (for [x (range 1 8) :while (odd? x) y (range 1 8)] [x y])
([1 1] [1 2] [1 3] [1 4] [1 5] [1 6] [1 7])

运行循环 while x很奇怪,然后就断了。

所以在你的第一个例子中,:while y 上的每次迭代都会中断当y等于 1因为没有 x 的值其中(and (< x 1) (even? x))持有 true .

另一方面,您的第二个示例有效,因为即使 :whiley 的第一次迭代时中断因为 (< 1 1) yield falsey的第二次迭代成功是因为 x2 开始,所以如果 y1 , 和 (and (< y x) (even? x))(and (< 1 2) (even? 2))其计算结果为 true .

http://clojuredocs.org/clojure_core/clojure.core/for更多细节。尤其是显示:when之间差异的部分和 :while .

关于clojure - 使用 for 列表推导会返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20732088/

相关文章:

java - 从 JVM 线程局部空间卸载 Clojure 变量

clojure - 如何测量 Clojure 函数执行所需的 CPU 时间?

serialization - 在 clojure 中序列化持久数据结构

python - 在 Python 中的列表理解内打印

python - IPython Notebook 中的列表理解返回 [None, None, None...]

python - 缩短 For 循环

Windows 上的 Clojure、Leiningen 和 CLASSPATH

Clojure 变量和 Java 静态方法

Python 和列表理解的性能

Python:如何对只有一种类型的重复出现的连续数字进行分组?