[Haskell-beginners] Python's collections.defaultdict(list) in Haskell?

Sylvain Henry hsyl20 at gmail.com
Tue Nov 10 13:24:35 UTC 2015


You can use insertWith:
http://hackage.haskell.org/package/containers-0.5.6.3/docs/Data-Map-Strict.html#g:6

E.g.:
let xs = [("Item0", ["a","b","c"]), ("Item1", ["x","y"])]
let m = Map.fromList xs
Map.insertWith (++) "Item0" ["d"] m

"d" is cons'ed from the left, so it shouldn't be too slow. I don't know why
insertWith has this type instead of:
Ord k => (b -> a -> a) -> k -> b -> Map k a -> Map k a
which would allow you to write Map.insertWith (:) "Item0" "d" m

Maybe you should report it.

--
Sylvain

2015-11-10 6:23 GMT+01:00 Dan Stromberg <strombrg at gmail.com>:

>
> These are some good leads.
>
> I'll be adding values one at a time, and yes, my keys aren't necessarily
> unique.
>
> Is there a way of cons'ing on the single values one at a time, that will
> avoid the slowness of ++ ?
>
> Thanks.
>
> On Mon, Nov 9, 2015 at 7:45 PM, Sylvain Henry <hsyl20 at gmail.com> wrote:
>
>> import qualified Data.Map as Map
>>
>> -- if your keys are unique
>> let xs = [("Item0", ["a","b","c"]), ("Item1", ["x","y"]), ("Item2",
>> ["abc","def"])]
>> Map.fromList xs
>>
>> -- if you want to combine values for keys that are equal
>> let xs = [("Item0", ["a","b","c"]), ("Item1", ["x","y"]), ("Item0",
>> ["abc","def"])]
>> Map.fromListWith (++) xs
>>
>> --
>> Sylvain
>>
>>
>> 2015-11-10 3:07 GMT+01:00 Dan Stromberg <strombrg at gmail.com>:
>>
>>>
>>> I'm spending a little time here and there to learn some Haskell.  I'm
>>> coming from a chiefly Python/C/bash background.
>>>
>>> I want to build a Data.Map where the keys are strings, and the values
>>> are lists of strings.
>>>
>>> In Python, collections.defaultdict(list) makes this pretty
>>> straightforward. It gives a hash table ("dict") that has values that
>>> default to an empty list, since list() produces an empty list. More info
>>> here:
>>> https://docs.python.org/3/library/collections.html#collections.defaultdict
>>>
>>> Is there an equivalent in Haskell?
>>>
>>> Thanks!
>>>
>>> --
>>> Dan Stromberg
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>
>
> --
> Dan Stromberg
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20151110/52eddb42/attachment.html>


More information about the Beginners mailing list