Clojure:带有reduce的匿名函数

时间:2017-07-15 07:08:36

标签: clojure

我是clojure的新手,并在clojure docs中注意到了这个例子。

this.state.action_name

输出: undefined

任何人都可以解释代码的逻辑吗?

3 个答案:

答案 0 :(得分:4)

reduce将函数应用于累加器和序列中的每个元素,从而构建最终结果。 ClojureDocs将the signature for 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是累加器的当前值,在reduce开始时为{}Destructuring syntax用于第二个参数,即要被抛出的当前值,即映射条目。地图条目被解构为其键k和值v。匿名函数的主体简单地放了一个新的"反转"进入累加器(即映射),以便原始序列v的值是键,键k成为值。结果类似于应用Clojure API函数map-invert

请注意,有一个单独的reduce-kv函数用于减少关联集合(例如,地图)。 reduce-kv"为你进行解构"。这允许将匿名函数写为:

(fn [m k v] (assoc m v k))

或者更简单地使用简短的符号:

#(assoc %1 %3 %2)

答案 1 :(得分:0)

第一个地图是空的,是一个可选的初始化值,它是传递给reduce函数的第一个参数。第二个地图是要减少其项目的集合。在这种情况下,每个项目都是MapEntry,它们作为第二个参数一次一个地传递给reduce函数。

假设您的输入映射有三个键/值对,则还原函数将被调用三次。 reduce函数的m参数引用第一次调用的初始化值(空映射),分解的第二个参数k and v来自MapEntry在迭代中传递对。

虽然reduce函数大多数时候会在操作后返回第一个参数,但在您的示例中,它会反转第二个参数的键/值并将新对与初始化值相关联,并不是严格要求所以..

答案 2 :(得分:0)

这意味着reduce具有函数{:b 2 :a 1 :c 3}的地图(fn [m [k v]] (assoc m v k)),它从地图中依次获取键值对[k v],并将其与累加器hash-map {{相关联1}}。累加器哈希映射的初始状态设置为空(m)。