[Haskell-cafe] Order of Map.fromListWith
plredmond at gmail.com
Thu Mar 3 17:44:14 UTC 2016
Correction: "the combiner has type 'k -> a -> a -> a'"
On Thursday, March 3, 2016, Patrick Redmond <plredmond at gmail.com> wrote:
> It looks like fromListWith is indeed implemented with a left fold over
> insertWithKey, with the Map as the accumulator. However, in insertWithKey
> the value-combiner function has type 'k -> a -> k -> a' which means it can
> combine in either order (it doesn't have to do with the fold or iteration
> order at all). The docs say:
> If the key does exist, the function will insert the pair @(key,f key new_value old_value)@.
> This doesn't really answer the "why" part of your question, but explains
> why you get [2, 1] instead of the reverse.
> On Thursday, March 3, 2016, Niklas Hambüchen <mail at nh2.me
>> Does anybody know why for fromListWith, the arguments to the combining
>> function seem flipped?
>> > import Data.Map
>> > fromListWith (++) [('a',),('a',)]
>> fromList [('a',[2,1])]
>> I often use it to group things by some key, e.g.
>> postsByUserId :: Map Int [Int]
>> postsByUserId =
>> fromListWith (++) [ (userId, [postId]) | (userId, postId) <- posts ]
>> and regularly get tricked by the postIds being reversed in the result.
>> This is especially unintuitive to me since:
>> > foldl (++)  [,]
>> > foldr (++)  [,]
>> Any ideas?
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe