谁可以向我解释这个事实:
user> ((partial merge-with +) {:a 1} {:a 2})
{:a 3}
user> (apply (partial merge-with +) ({:a 1} {:a 2}))
nil
为什么我在第二种情况下获得nil
?
第二行出了什么问题?
答案 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