4clojure#69与函数合并

时间:2017-02-28 19:39:12

标签: clojure

这是我的解决方案。

(defn mf [f & ms] (
  (let [mm (apply merge ms)
        ks (keys mm)
        rf (fn [koef fc maps] (reduce fc (filter #(not (= % nil)) (map koef maps))))] 
    (into {} (map #(vector % (rf % f ms)) ks)))))

当我尝试使用它时,我遇到了错误。

(mf + {:a 1 :b 2 :d 7} {:a 2 :b 3 :c 6})

ArityException传递给args(0)的数目错误:PersistentArrayMap clojure.lang.AFn.throwArity(AFn.java:429)

但是,当我逐行输入repl中的定义时,一切顺利。

>(def f +)
>(def ms '({:a 1 :b 2 :d 7} {:a 2 :b 3 :c 6}))
>(def mm (apply merge ms))
...
>(into {} (map #(vector % (rf % f ms)) ks))
{:c 6, :a 3, :b 5, :d 7}
>

我的解决方案有什么问题?

1 个答案:

答案 0 :(得分:1)

简单的拼写错误。你有一对额外的括号。它应该是:

(defn mf [f & ms]
  (let [mm (apply merge ms)
        ks (keys mm)
        rf (fn [koef fc maps] (reduce fc (filter #(not (= % nil)) (map koef maps))))]
    (into {} (map #(vector % (rf % f ms)) ks))))

(mf + {:a 1, :b 2, :d 7} {:a 2, :b 3, :c 6}) 
    => {:a 3, :b 5, :d 7, :c 6}