我有以下函数,应该返回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
的附加参数,因为您知道这个序列中有两个元素,它应该产生一个正确的调用。