Я пытаюсь придумать способ преобразования хешмара clojure, применяя к каждому значению функцию с другой карты. Вот то, что я до сих пор:Преобразование карты с картой функций в clojure
(defn transform-map [m fm]
(into {} (for [[k v] m]
(let [mfn (get fm k identity)] [k (mfn v)])))
(def m {:a 0 :b 0 :c 0 :d 0})
(def fm {:a inc :b dec :c identity})
(transform-map m fm) ;=> {:a 1, :b -1, :c 0, :d 0}
Это прекрасно работает, но только до тех пор, пока каждая функция принимает один аргумент, который является текущим значением ключа. Что делать, если я хочу поместить функцию в свою карту функций, которая использует значения, отличные от тех, которые находятся в одном ключе? Например, предположим, что я хочу поместить сумму ключей :a
и :b
в ключ :d
?
я могу попробовать что-то вроде:
(assoc fm :d (fn[a b] (+ a b)))
но есть способ, которым я могу изменить мою transform-map
функции так, он будет использовать соответствующие аргументы в этом вызове функции?
Мне нравится этот подход, @Ankur. Один недостаток, IMO, хотя заключается в том, что, поскольку вы «сопоставляете» по файлу 'fm', вы не можете автоматически передавать ключи в' m', которые не имеют ключей в 'fm' для вывода. Это довольно легко исправить, хотя «слияние» с отсутствующими ключами. Благодаря! – stand
Yup, в приведенной выше реализации, 'transformations' решает ключи выходной карты. – Ankur
Эй, @ Анкур, отличный ответ! Но вы не могли бы заменить ((примените juxt (rest v)) m) с (map (partial get m) (rest v))? Или, так как встроенные реализации карты также можно вызывать, вы можете упростить все дальше - (map m (rest v)). Есть ли какая-то конкретная причина, по которой вы использовали juxt? –