It's not terse, but it is easier to follow.

(defn flip
  [f x y]
  (f y x))

(defn update-nums
  [m f]
  (update m :qs
          (fn [x]
            (flip map x
                  (fn [x]
                    (update-in x [:nums]
                               #(map f %)))))))

;; (update-nums m inc)
;;=> {:qs ({:nums (4 2 3)} {:nums (8 5)})}





On Tuesday, October 10, 2017 at 12:27:45 PM UTC-4, Rob Nikander wrote:
>
> Gah. I changed one name and not another. I meant:
>
> (update-in m [:qs * :nums] ...)
>
>
>
> On Tuesday, October 10, 2017 at 10:18:56 AM UTC-4, Rob Nikander wrote:
>>
>> Hi,
>>
>> Say I have a map like this:
>>
>>     (def m {:qs [{:nums [3 1 2]} {:nums [7 4]}]})
>>
>> I want to transform each number with a function (say, `inc`). I imagine 
>> something like this:
>>
>>     (update-in m [:qs * :cell-fns] #(map inc %))  
>>     ; or 
>>     (update-in m [:qs * :cell-fns *] inc)  
>>
>>
>> But of course you can't write that.  The following code works, but I 
>> don't like reading it:
>>
>>     (update m :qs   
>>         (fn [qs]
>>           (mapv
>>             (fn [q] 
>>               (update q :nums #(mapv inc %)))
>>             qs)))
>>     => {:qs [{:nums [4 2 3]} {:nums [8 5]}]}
>>
>> Is there an idiomatic way to do this, that looks more like the shorter 
>> `update-in` idea?
>>
>> Rob
>>
>>
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to