Chcę przekształcić jedną mapę wartości na inną mapę z tymi samymi kluczami, ale z funkcją zastosowaną do wartości. Wydaje mi się, że w interfejsie API clojure istnieje funkcja umożliwiająca wykonanie tej czynności, ale nie mogłem jej znaleźć.
Oto przykładowa implementacja tego, czego szukam
(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}
Czy ktoś wie, czy map-function-on-map-vals
już istnieje? Myślę, że tak (prawdopodobnie z ładniejszą nazwą).
dictionary
clojure
map-function
Tomasz
źródło
źródło
map
jakiegoś powodu spodziewałem się [fm] .Możesz użyć
clojure.algo.generic.functor/fmap
:źródło
org.clojure/algo.generic "0.1.0"
przykład powinien teraz brzmieć:(use '[clojure.algo.generic.functor :only (fmap)]) (fmap inc {:a 1 :b 3 :c 5})
fmap
w ClojureScript?Oto dość typowy sposób przekształcania mapy.
zipmap
pobiera listę kluczy i listę wartości i „robi właściwą rzecz” tworząc nową mapę Clojure. Możesz również umieścićmap
wokół klawiszy, aby je zmienić, lub oba.lub aby zawrzeć to w swojej funkcji:
źródło
Zaczerpnięte z książki kucharskiej Clojure, jest Redukcja kv:
źródło
Oto dość idiomatyczny sposób, aby to zrobić:
Przykład:
źródło
map-map
,map-map-keys
imap-map-values
Nie znam żadnej istniejącej funkcji w Clojure do tego, ale oto implementacja tej funkcji, ponieważ
map-map-values
możesz ją kopiować. Zawiera dwie ściśle powiązane funkcjemap-map
imap-map-keys
, których również brakuje w standardowej bibliotece:Stosowanie
Możesz zadzwonić w
map-map-values
ten sposób:A pozostałe dwie funkcje, takie jak ta:
Alternatywne implementacje
Jeśli chcesz
map-map-keys
lubmap-map-values
bez bardziej ogólnejmap-map
funkcji, możesz użyć tych implementacji, które nie polegają namap-map
:Poniżej znajduje się alternatywna implementacja,
map-map
która jest oparta naclojure.walk/walk
zamiastinto
, jeśli wolisz to sformułowanie:Wersje Parellel -
pmap-map
itp.Istnieją również równoległe wersje tych funkcji, jeśli ich potrzebujesz. Po prostu używają
pmap
zamiastmap
.źródło
Jestem Clojure n00b, więc mogą być znacznie bardziej eleganckie rozwiązania. To moje:
Funkcja anon tworzy małą listę 2 z każdego klucza i jego wartości f'ed. Mapcat uruchamia tę funkcję na sekwencji kluczy mapy i łączy całość prac w jedną dużą listę. „Apply hash-map” tworzy nową mapę z tej sekwencji. (% M) może wyglądać trochę dziwnie, jest to idiomatyczne Clojure do stosowania klucza do mapy w celu wyszukania powiązanej wartości.
Najbardziej polecana lektura: Ściągawka Clojure .
źródło
źródło
Podoba mi się twoja
reduce
wersja. Z bardzo niewielkimi odchyleniami może również zachowywać typy struktur rekordów:{}
Został zastąpionym
. Po tej zmianie rekordy pozostają zapisami:Rozpoczynając od
{}
, rekord traci swoją nagrywalność , którą można chcieć zachować, jeśli pożądane są możliwości rekordu (na przykład reprezentacja pamięci kompaktowej).źródło
Zastanawiam się, dlaczego nikt jeszcze nie wspomniał o bibliotece widm . Został napisany, aby uczynić ten rodzaj transformacji łatwym do zakodowania (a co ważniejsze, napisany kod był łatwy do zrozumienia), a jednocześnie jest bardzo wydajny:
Pisanie takiej funkcji w czystym Clojure jest proste, ale kod staje się znacznie trudniejszy, gdy przejdziesz do wysoce zagnieżdżonego kodu złożonego z różnych struktur danych. I tu pojawia się widmo .
Polecam obejrzenie tego odcinka w Clojure TV, który wyjaśnia motywację i szczegóły widma .
źródło
Clojure 1.7 ( wydany 30 czerwca 2015) zapewnia eleganckie rozwiązanie z
update
:źródło