Tôi có thể đặt chức năng nào làm FOO ở đây để mang lại giá trị đúng vào cuối? Tôi đã chơi với bộ băm (chỉ đúng cho 2 giá trị đầu tiên), conj, và concat nhưng tôi biết tôi không xử lý đơn nguyên tố vs set condition đúng với bất kỳ điều nào trong số đó.Hợp nhất danh sách bản đồ và kết hợp các giá trị với các bộ trong Clojure
(defn mergeMatches [propertyMapList]
"Take a list of maps and merges them combining values into a set"
(reduce #(merge-with FOO %1 %2) {} propertyMapList))
(def in
(list
{:a 1}
{:a 2}
{:a 3}
{:b 4}
{:b 5}
{:b 6}))
(def out
{ :a #{ 1 2 3}
:b #{ 4 5 6} })
; this should return true
(= (mergeMatches in) out)
Cách thành ngữ nhất để xử lý vấn đề này là gì?
a) do hạn chế không có chức năng ẩn danh lồng nhau, nó cũng không hợp lệ. b) không quá đẹp! :) –
Ngoài ra, tôi nghĩ rằng điều này sẽ trả về một bộ bản đồ thay vì bản đồ với các giá trị đã đặt. –
@ Alex: a) Không có giới hạn nào như vậy. Bạn không thể lồng hàm ẩn danh * literals * (được tạo bằng '# (...)'), nhưng bạn có thể lồng các hàm ẩn danh (mặc dù bạn sẽ cần sử dụng 'fn'). b) Một vấn đề của hương vị, tôi đoán. :-) Ngoài ra, bạn nên thử thực sự chạy nó, vì nó xảy ra chức năng nó tạo ra thực sự làm cho biểu thức kiểm tra của bạn trả về 'true' khi thay thế thay cho' FOO' trong biểu thức 'reduce' của bạn. –