我是 clojure 的新手,并在 clojure 文档中注意到了这个例子。
(reduce (fn [m [k v]] (assoc m v k)) {}{:b 2 :a 1 :c 3})
输出: ;;=> {2 :b, 1 :a, 3 :c}
有人可以解释代码背后的逻辑吗?
reduce将函数应用于累加器和序列中的每个元素,构建最终结果。ClojureDocs 将 reduce的签名指定为(reduce f coll)或(reduce f val coll)。您的示例具有后一个签名,其中元素匹配如下:
f :应用于每个条目的函数, (fn [m [k v]] ...val : 初始累加器, {}coll :要操作的集合, {:b 2 :a 1 :c 3}请注意,reduce 调用的第二个和第三个参数之间没有分隔符(即空格)。Clojure 不需要。
然后,望着内部匿名函数:(fn [m [k v]] (assoc m v k))。第一个参数m是累加器的当前值,它是{}在缩减开始时。解构语法用于第二个参数,它是要处理的当前值,即一个映射条目。映射条目被分解为其键k和值v。匿名函数的主体只是简单地向累加器(即map)中放入了一个新的“反向”条目,这样原始序列的值v就是键,键k变成了值。结果类似于应用 Clojure API 函数map-invert。
请注意,有一个单独的reduce-kv函数用于减少关联集合(例如,地图)。reduce-kv“为你做解构”。这允许匿名函数写为:
(fn [m k v] (assoc m v k))
Run Code Online (Sandbox Code Playgroud)
或者更简单地使用简短的符号:
#(assoc %1 %3 %2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
579 次 |
| 最近记录: |