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

时间:2014-05-01 06:02:59

标签: clojure functional-programming

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

user> ((partial merge-with +) {:a 1} {:a 2})
{:a 3}
user> (apply (partial merge-with +) ({:a 1} {:a 2}))
nil

为什么我在第二种情况下获得nil? 第二行出了什么问题?

2 个答案:

答案 0 :(得分:8)

表达式

({:a 1} {:a 2})

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

(let [f {:a 1}]
  (f {:a 2}))

相当于({: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}])可以正常使用。

答案 1 :(得分:2)

在第二种情况下,当您({:a 1} {:a 2})时,由于地图充当从中获取值的函数,您正在做的事情等同于(get {:a 1} {:a 2}){:a 2}不是{:a 1}中的关键,您得到nil。然后,将函数超过nil得到nil。

您需要做的是引用列表,例如不将其评估为函数应用程序

user=> (apply (partial merge-with +) '({:a 1} {:a 2}))
{:a 3}

或使用矢量(在clojure中更为惯用)

user=> (apply (partial merge-with +) [{:a 1} {:a 2}])
{:a 3}

Juan Manuel