Can anybody explain why fmap, when operating on an IPersistentMap,
only passes the function the value of the map entry, instead of the
entire map entry (i.e., the key and value pair)?  It seems a bit odd
in that all the other implementations of fmap operate on the entire
item in the sequence.  Also, I can imagine cases where you'd want to
do some map transformation that also depends on the key (do something
for entries A, B, and C, but something else for entries X, Y, and Z).

I suppose I could use remove-method and then write my own fmap
implementation for IPersistentMap.  I'm curious about the design,
though.

Thanks,
Chris

On Tue, Feb 22, 2011 at 6:56 PM, Benny Tsai <benny.t...@gmail.com> wrote:
> There is fmap from clojure.contrib.generic.functor, which expects a
> function of arity 1, for just the value:
>
> (use 'clojure.contrib.generic.functor)
> (require '[clojure.string :as str])
>
> (def my-map {:first "john" :last "smith" :age 25})
>
> (defn my-fn [value]
>  (if (string? value)
>    (str/upper-case value)
>    value))
>
> user=> (fmap my-fn my-map)
> {:first "JOHN", :last "SMITH", :age 25}
>
> On Feb 22, 4:23 pm, rob levy <r.p.l...@gmail.com> wrote:
>> The usual intuitive options for this are reduce, zipmap, or into.  You can
>> also write a lazily recursive solution.  I wonder why there's no function in
>> core that lazily re-constructs the map with the results of the function?  It
>> seems to have been discussed on the list at least once or twice.  It seems
>> like there would have to be two versions of it, one expecting a function
>> with an arity of one (for just the value) and another expecting an arity of
>> two (key and value).
>>
>>
>>
>>
>>
>>
>>
>> On Mon, Feb 21, 2011 at 10:08 PM, yair <yair....@gmail.com> wrote:
>> > I'm hoping this is a dumb question and I've missed something obvious.
>> > I have a map with various key-value pairs and I want to transform some
>> > of the values, e.g.
>>
>> > (def mymap {:first "john" :last "smith" :age 25}) and say I want to
>> > change the strings to be upper case.
>> > Right now all I can think of doing is using reduce and passing in an
>> > empty map and the re-associating each key with the (possibly)
>> > transformed value.  Is there something like the map function that
>> > takes two parameters, one a function that receives a pair and returns
>> > a new pair, and the other a map, and returns a map that's
>> > reconstituted from those pairs?
>>
>> > Thanks
>>
>> > --
>> > 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 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 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

Reply via email to