Loops clojure for loop,将值存储在集合或映射中
这件事已经困扰了我一段时间了, 我们应该如何在for循环的集合或映射中存储值Loops clojure for loop,将值存储在集合或映射中,loops,functional-programming,clojure,immutability,Loops,Functional Programming,Clojure,Immutability,这件事已经困扰了我一段时间了, 我们应该如何在for循环的集合或映射中存储值 (let [s #{}] (for [ i (range 10) j (range 10) ] (into s [i j]))) 我知道这不起作用,但我想要一个类似于此的功能,其中集合最终将包含[0 0][0 1]…[0 9][1 0]…[9] 谢谢clojure有几个很棒的管理可变状态的系统。在这种情况下,您可能需要包含一个集合的 您的其他选择包括: a如果需要进行多
(let [s #{}]
(for [ i (range 10)
j (range 10) ]
(into s [i j])))
我知道这不起作用,但我想要一个类似于此的功能,其中集合最终将包含[0 0][0 1]…[0 9][1 0]…[9]
谢谢clojure有几个很棒的管理可变状态的系统。在这种情况下,您可能需要包含一个集合的 您的其他选择包括:
- a如果需要进行多个更改(协调多个线程)
- a如果这将是单线程的(var在这里可能与atom一样工作)
- 如果要异步设置s的值,则为
for
已经返回了一个序列,因此您可能只需要
(into #{} (for [ i (range 10)
j (range 10) ]
[i j]))
如果我正确理解你的问题,你需要把你的表达翻过来:
(let [s #{}]
(into s (for [i (range 10)
j (range 10)]
[i j])))
这里要实现的是返回一个值(一个延迟序列),这与Java和C等命令式语言中的for循环不同。这就是您想要的吗
(into #{} (for [i (range 10) j (range 10)]
[i j]))
;-> #{[2 1] [3 2] [4 3] [5 4] [6 5] [7 6] [8 7] [9 8] [1 0]
; [2 2] [3 3] [4 4] [5 5] [6 6]...
如果您只想将列表作为一个集合:
(set (for [i (range 10) j (range 10)]
[i j]))
通常,当您想从对seq的“重复”广义操作中返回一个不是seq的set或map或其他“单值”时,使用reduce
比loop/recur
更为惯用/直接,并且for
始终返回一个seq(而不是set或map)
请注意,此处的(for…)仅用于生成包含要编译为单个结果集的所有值的seq。或者,例如:
(reduce + 0 (range 100))
=> 4950
我认为您也可以在这个场景中使用一些临时数据结构
(let [s (transient #{})]
(for [ i (range 10)
j (range 10) ]
(assoc! s i j)))
(persistent! s)
只是一个代码示例,没有经过测试。据我所知,这里的第一个代码片段没有任何意义?这不是使用
交换的有效方法代码>,正如你后来提到的,无论如何这不是一个好主意。第一个狙击手并不是答案的重点,所以我只是删除了它。在没有测试tisk Tiskt的情况下摆姿势这是不正确的。From:“请特别注意,瞬态的设计不是为了就地攻击。您必须在下一次调用中捕获并使用返回值。这样,它们支持与它们所替换的功能性持久代码相同的代码结构”。感谢大家的回复。
(let [s (transient #{})]
(for [ i (range 10)
j (range 10) ]
(assoc! s i j)))
(persistent! s)