Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops clojure for loop,将值存储在集合或映射中_Loops_Functional Programming_Clojure_Immutability - Fatal编程技术网

Loops clojure for loop,将值存储在集合或映射中

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如果需要进行多

这件事已经困扰了我一段时间了, 我们应该如何在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如果需要进行多个更改(协调多个线程)
  • 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)