быстрый способ применить хеш-карту к анонимной функции в clojure - PullRequest
0 голосов
/ 13 октября 2018

У меня вопрос: есть ли хеш-карта

(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 голосов
/ 14 октября 2018

Лично я бы не стал изменять функцию, чтобы она принимала карту в качестве аргумента, так как она делает саму функцию менее универсальной.Альтернативное (и, по-моему, идиоматическое, для любого языка) решение состоит в том, чтобы выбрать нужные ключи на карте, прежде чем передавать их в функцию.Это довольно просто, поскольку и карта, и символ (и ключевое слово тоже) имеют семантику функции в clojure:

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

user> (apply f ((juxt 'x 'y 'z) my-map))
;;=> 7
0 голосов
/ 13 октября 2018

Вы можете использовать деструктуризацию карты:

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