Saya ingin mengubah satu peta nilai ke peta lain dengan tombol yang sama tetapi dengan fungsi yang diterapkan pada nilai-nilai. Saya akan berpikir ada fungsi untuk melakukan ini di api clojure, tetapi saya tidak dapat menemukannya.
Berikut ini contoh implementasi dari apa yang saya cari
(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}
Adakah yang tahu kalau map-function-on-map-vals
sudah ada? Saya akan berpikir itu (mungkin dengan nama yang lebih bagus juga).
dictionary
clojure
map-function
Thomas
sumber
sumber
map
untuk beberapa alasan.Anda dapat menggunakan
clojure.algo.generic.functor/fmap
:sumber
org.clojure/algo.generic "0.1.0"
contohnya sekarang harus membaca:(use '[clojure.algo.generic.functor :only (fmap)]) (fmap inc {:a 1 :b 3 :c 5})
fmap
Adakah yang bisa Anda temukan di ClojureScript?Berikut adalah cara yang cukup umum untuk mengubah peta.
zipmap
mengambil daftar kunci dan daftar nilai dan "melakukan hal yang benar" menghasilkan peta Clojure baru. Anda juga bisa meletakkan tombol dimap
sekeliling untuk mengubahnya, atau keduanya.atau untuk membungkusnya dengan fungsi Anda:
sumber
Diambil dari Clojure Cookbook, ada pengurangan-kv:
sumber
Berikut cara yang cukup idiomatis untuk melakukan ini:
Contoh:
sumber
map-map
,,map-map-keys
danmap-map-values
Saya tahu tidak ada fungsi yang ada di Clojure untuk ini, tapi ini adalah implementasi dari fungsi itu karena
map-map-values
Anda bebas untuk menyalin. Itu datang dengan dua fungsi terkait erat,map-map
danmap-map-keys
, yang juga hilang dari perpustakaan standar:Pemakaian
Anda dapat memanggil
map-map-values
seperti ini:Dan dua fungsi lainnya seperti ini:
Implementasi alternatif
Jika Anda hanya ingin
map-map-keys
ataumap-map-values
, tanpa fungsi yang lebih umummap-map
, Anda dapat menggunakan implementasi ini, yang tidak bergantung padamap-map
:Juga, inilah implementasi alternatif
map-map
yang didasarkan padaclojure.walk/walk
alih-alihinto
, jika Anda lebih suka ungkapan ini:Versi parellel -
pmap-map
, dll.Ada juga versi paralel dari fungsi-fungsi ini jika Anda membutuhkannya. Mereka hanya menggunakan
pmap
bukanmap
.sumber
Saya seorang Clojure n00b, jadi mungkin ada solusi yang jauh lebih elegan. Ini milik saya:
Fungsi anon membuat 2-daftar kecil dari setiap tombol dan nilainya. Mapcat menjalankan fungsi ini di atas urutan tombol peta dan menggabungkan seluruh pekerjaan menjadi satu daftar besar. "apply hash-map" membuat peta baru dari urutan itu. (% M) mungkin terlihat sedikit aneh, itu adalah Clojure idiomatik karena menerapkan kunci ke peta untuk mencari nilai yang terkait.
Bacaan yang paling sangat direkomendasikan: The Cheat Sheet Clojure .
sumber
sumber
Saya suka
reduce
versimu. Dengan variasi yang sangat sedikit, ini juga dapat mempertahankan jenis struktur rekaman:The
{}
digantikan olehm
. Dengan perubahan itu, catatan tetap menjadi catatan:Dengan memulainya
{}
, record kehilangan recordiness -nya , yang mungkin ingin dipertahankan, jika Anda menginginkan kemampuan record (misalnya representasi memori kompak).sumber
Saya bertanya-tanya mengapa belum ada yang menyebutkan perpustakaan momok . Telah ditulis untuk membuat transformasi semacam ini mudah dikodekan (dan, yang lebih penting, kode tertulis itu mudah dipahami), sambil tetap sangat performan:
Menulis fungsi seperti itu di Clojure murni itu sederhana, tetapi kode menjadi jauh lebih rumit setelah Anda beralih ke kode yang sangat bersarang terdiri dari struktur data yang berbeda. Dan di sinilah momok masuk.
Saya merekomendasikan menonton episode ini di Clojure TV yang menjelaskan motivasi dan detail momok .
sumber
Clojure 1.7 ( dirilis 30 Juni 2015) memberikan solusi elegan untuk ini dengan
update
:sumber