Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中将哈希映射应用于匿名函数的快速方法_Clojure_Hashmap_Anonymous Function - Fatal编程技术网

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

在clojure中将哈希映射应用于匿名函数的快速方法,clojure,hashmap,anonymous-function,Clojure,Hashmap,Anonymous Function,我的问题是是否给了hashmap (定义我的地图{'x1'y2'z}) 我可以将其应用于匿名函数 (fn[x y z](+x(*y z)) 使参数与映射中的键匹配,比如 (应用我的地图(fn[x y z](+x(*y z))) 这个问题有没有简单的解决方法?我觉得有,但我想不出来。您可以使用地图分解: user> (def my-map {'x 1 'y 2 'z 3}) #'user/my-map user> ((fn [{x 'x y 'y z 'z}] (+ x (* y z

我的问题是是否给了hashmap

(定义我的地图{'x1'y2'z})

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

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

使参数与映射中的键匹配,比如

(应用我的地图(fn[x y z](+x(*y z)))


这个问题有没有简单的解决方法?我觉得有,但我想不出来。

您可以使用地图分解:

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-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

就我个人而言,我不会修改函数以接受map作为arg,因为它使函数本身不那么通用。另一种解决方案(我想对于任何语言来说都是惯用的)是在将所需的键传递给函数之前从map中选择键。这非常容易,因为map和symbol(以及关键字)都是如此在clojure中具有函数语义:

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

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