将哈希映射应用于Clojure中的匿名函数的快速方法

时间:2018-10-13 18:23:03

标签: clojure hashmap anonymous-function

我的问题是是否给定哈希图

(def my-map {'x 1 'y 2 'z})

我可以将其应用于匿名函数

(fn [x y z] (+ x (* y z))

使参数与地图中的键匹配,类似

(apply-ish my-map (fn [x y z] (+ x (* y z)))

是否有解决此问题的简便方法?我感觉好像有,但我无法弄清楚。

2 个答案:

答案 0 :(得分:1)

您可以使用地图解构:

user> (def my-map {'x 1 'y 2 'z 3})
#'user/my-map

user> ((fn [{x 'x y 'y z 'z}] (+ x (* y z))) my-map)
7

您可以使用这种解构形式简化一些操作

user> ((fn [{:syms [x y z]}] (+ x (* y z))) my-map)
7

或者如果您将关键字用作地图键:

user> (def my-map2 {:x 1 :y 2 :z 3})
#'user/my-map2

user> ((fn [{:keys [x y z]}] (+ x (* y z))) my-map2)
7

答案 1 :(得分:1)

就个人而言,我不会修改该函数以将地图接受为arg,因为它使函数本身的通用性降低。另一种解决方案(对于任何语言来说都是惯用的解决方案)是在将其传递给功能之前从地图中选择所需的键。这很容易,因为map和symbol(还有关键字)在clojure中都具有函数语义:

user> (apply f (map my-map ['x 'y 'z]))
;;=> 7

user> (apply f ((juxt 'x 'y 'z) my-map))
;;=> 7