在Clojure中使用reduce with partial失败



我有以下函数,应该返回update-in函数的答案:

(defn abc
[a fruit-1 fruit-2]
(update-in a ["apples" (xyz fruit-1)]
add-apple
fruit-1
fruit-2))

和我使用减少部分(因为函数有3个参数)调用该函数:

(let [fruits (get-fruits config)]
(let [the-basket (reduce (partial abc empty-map) (first fruits) (second fruits))]
(if (empty? (the-basket "apples"))
(throw (ex-info "Couldn't find" {}))
the-basket)))

其中fruits包含两个元素。

然而,它甚至没有调用"abc";函数(通过调试)和the-basket直接得到与(first fruits)完全相同的值。

显然,我没有使用这个减少&部分:(reduce (partial abc empty-map) (first fruits) (second fruits))

是正确的方式调用函数与3个参数通过减少;还是有其他(更好的)方法?

reduce的这种用法是不正确的,原因如下:

使用(partial abc empty-map)意味着结果函数有两个参数,但是第一个参数a总是empty-map。它不会就地更新。reduce的工作方式也会在这里为您产生不正确的值。

在您的示例代码中,它将使用第一个水果和对第二个水果调用first的结果调用部分函数,这可能会给您一个不正确的值,因为reduce的三个参数形式期望第二个参数是初始值,第三个参数是一个序列。

在这种情况下,你知道fruits将只有两个值,你最有可能寻找apply,如下所示:

(apply abc empty-map fruits)

这将产生对abc的调用,empty-map作为第一个参数,fruits的每个元素都是abc的附加参数,因为您知道这个序列中有两个元素,它应该产生一个正确的调用。

最新更新