Ich möchte eine Wertekarte mit denselben Tasten in eine andere Karte umwandeln, jedoch mit einer Funktion, die auf die Werte angewendet wird. Ich würde denken, dass es in der Clojure-API eine Funktion dafür gibt, aber ich konnte sie nicht finden.
Hier ist eine Beispielimplementierung dessen, wonach ich suche
(defn map-function-on-map-vals [m f]
(reduce (fn [altered-map [k v]] (assoc altered-map k (f v))) {} m))
(println (map-function-on-map-vals {:a "test" :b "testing"} #(.toUpperCase %)))
{:b TESTING, :a TEST}
Weiß jemand, ob es map-function-on-map-vals
bereits existiert? Ich würde denken, dass es so ist (wahrscheinlich auch mit einem schöneren Namen).
dictionary
clojure
map-function
Thomas
quelle
quelle
map
aus irgendeinem Grund erwartet .Sie können Folgendes verwenden
clojure.algo.generic.functor/fmap
:quelle
org.clojure/algo.generic "0.1.0"
Das Beispiel sollte nun lauten:(use '[clojure.algo.generic.functor :only (fmap)]) (fmap inc {:a 1 :b 3 :c 5})
fmap
in ClojureScript findet?Hier ist ein ziemlich typischer Weg, um eine Karte zu transformieren.
zipmap
nimmt eine Liste von Schlüsseln und eine Liste von Werten und "macht das Richtige", um eine neue Clojure-Karte zu erstellen. Sie können auchmap
die Tasten um die Tasten legen, um sie zu ändern, oder beides.oder um es in Ihre Funktion einzupacken:
quelle
Aus dem Clojure-Kochbuch entnommen, gibt es reduziertes kv:
quelle
Hier ist ein ziemlich idiomatischer Weg, dies zu tun:
Beispiel:
quelle
map-map
,map-map-keys
Undmap-map-values
Ich kenne keine existierende Funktion in Clojure dafür, aber hier ist eine Implementierung dieser Funktion, da
map-map-values
Sie frei kopieren können. Es kommt mit zwei eng verwandten Funktionenmap-map
undmap-map-keys
, die auch in der Standardbibliothek fehlen:Verwendung
Sie können so anrufen
map-map-values
:Und die anderen beiden Funktionen wie folgt:
Alternative Implementierungen
Wenn Sie nur
map-map-keys
odermap-map-values
ohne die allgemeineremap-map
Funktion möchten , können Sie diese Implementierungen verwenden, die nicht auf Folgendem beruhenmap-map
:Hier ist auch eine alternative Implementierung
map-map
, die auf basiert,clojure.walk/walk
anstattinto
, wenn Sie diese Formulierung bevorzugen:Parellel-Versionen -
pmap-map
usw.Es gibt auch parallele Versionen dieser Funktionen, wenn Sie sie benötigen. Sie verwenden einfach
pmap
anstelle vonmap
.quelle
Ich bin ein Clojure n00b, daher gibt es möglicherweise viel elegantere Lösungen. Hier ist meins:
Die anon func erstellt aus jedem Schlüssel und seinem angegebenen Wert eine kleine 2-Liste. Mapcat führt diese Funktion über die Reihenfolge der Tasten der Karte aus und verkettet die gesamten Werke zu einer großen Liste. "Hash-Map anwenden" erstellt aus dieser Sequenz eine neue Map. Das (% m) mag etwas seltsam aussehen. Es ist eine idiomatische Clojure, um einen Schlüssel auf eine Karte anzuwenden, um den zugehörigen Wert nachzuschlagen.
Am meisten empfohlene Lektüre: The Clojure Cheat Sheet .
quelle
quelle
Ich mag deine
reduce
Version. Mit einer sehr geringen Abweichung kann auch die Art der Datensatzstrukturen beibehalten werden:Das
{}
wurde ersetzt durchm
. Mit dieser Änderung bleiben Datensätze Datensätze:Zu Beginn
{}
verliert der Datensatz seine Aufzeichnungsfähigkeit , die möglicherweise beibehalten werden soll, wenn Sie die Aufzeichnungsfunktionen wünschen (z. B. kompakte Speicherdarstellung).quelle
Ich frage mich, warum noch niemand die Gespensterbibliothek erwähnt hat . Es wurde geschrieben, um diese Art der Transformation einfach zu codieren (und, was noch wichtiger ist, den geschriebenen Code leicht zu verstehen), während es dennoch sehr performant ist:
Das Schreiben einer solchen Funktion in reinem Clojure ist einfach, aber der Code wird viel schwieriger, wenn Sie zu hoch verschachteltem Code übergehen, der aus verschiedenen Datenstrukturen besteht. Und hier kommt das Gespenst ins Spiel .
Ich empfehle, diese Episode auf Clojure TV zu sehen, in der die Motivation und die Details des Gespenstes erklärt werden .
quelle
Clojure 1.7 ( veröffentlicht am 30. Juni 2015) bietet hierfür eine elegante Lösung mit
update
:quelle