在Clojure中应用/合并的奇怪之处

Igo*_*bin 2 functional-programming clojure

谁可以向我解释这个事实:

user> ((partial merge-with +) {:a 1} {:a 2})
{:a 3}
user> (apply (partial merge-with +) ({:a 1} {:a 2}))
nil
Run Code Online (Sandbox Code Playgroud)

为什么我要nil进入第二种情况?第二行出了什么问题?

Jon*_*nas 8

表达方式

({:a 1} {:a 2})
Run Code Online (Sandbox Code Playgroud)

评估为nil.Clojure中的映射是一个函数,它接受一个键并返回相应的值.表达方式

(let [f {:a 1}]
  (f {:a 2}))
Run Code Online (Sandbox Code Playgroud)

这相当于({:a 1} {:a 2})尝试在地图中查找 {:a 2},因为地图 {:a 1}中没有这样的键nil被返回.

回到原来的问题,你所要做的就是将列表更改({:a 1} {:a 2})为向量[{:a 1} {:a 2}],它将按预期工作.另请注意,partial在这种特殊情况下,您不需要(apply merge-with + [{:a 1} {:a 3}])工作得很好.