Отображение функции на значениях карты в Clojure

LINQ to SQL, по-видимому, не подходит, если вы не используете SQL Server (или SQL Server compact), поэтому для меня было достаточной причиной избежать его и использовать EF (я хотел использовать PostgreSQL).

В v1 EF определенно не хватает вещей, которые заставили бы меня смущаться рекомендовать это. Похоже, что версия 2 EF (когда выйдет) будет первой версией, которую можно было бы серьезно рекомендовать для перехода на.

128
задан Will Ness 7 February 2016 в 22:02
поделиться

4 ответа

Мне очень нравится ваша версия reduce . Я считаю это идиоматическим. Вот версия, в любом случае использующая понимание списка.

(defn foo [m f]
  (into {} (for [[k v] m] [k (f v)])))
143
ответ дан 24 November 2019 в 00:36
поделиться

Вот довольно типичный способ преобразования карты. zipmap берет список ключей и список значений и «делает правильные вещи», создавая новую карту Clojure. Вы также можете поместить карту карту вокруг клавиш, чтобы изменить их, или и то, и другое.

(zipmap (keys data) (map #(do-stuff %) (vals data)))

или заключить его в свою функцию:

(defn map-function-on-map-vals [m f]
    (zipmap (keys m) (map f (vals m))))
33
ответ дан 24 November 2019 в 00:36
поделиться

Here's a fairly idiomatic way to do this:

(defn map-function-on-map-vals [m f]
        (apply merge
               (map (fn [[k v]] {k (f v)})
                    m)))

Example:

user> (map-function-on-map-vals {1 1, 2 2, 3 3} inc))
{3 4, 2 3, 1 2}
8
ответ дан 24 November 2019 в 00:36
поделиться

Я Clojure n00b, так что их может быть много более элегантные решения. Вот мой:

(def example {:a 1 :b 2 :c 3 :d 4})
(def func #(* % %))

(prn example)

(defn remap [m f]
  (apply hash-map (mapcat #(list % (f (% m))) (keys m))))

(prn (remap example func))

Функция anon составляет небольшой 2-список из каждого ключа и его значения f'ed. Mapcat запускает эту функцию над последовательностью ключей карты и объединяет все работы в один большой список. "apply hash-map" создает новую карту из этой последовательности. (% M) может выглядеть немного странно, это идиоматический Clojure для применения ключа к карте для поиска связанного значения.

Наиболее рекомендуемая литература: Шпаргалка по Clojure .

2
ответ дан 24 November 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: