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

Sylvain Henry hsyl20 at gmail.com
Tue Nov 10 13:30:15 UTC 2015


Oh forget the last part of my email: if the key doesn't exist, insertWith
has to insert the new value, hence its type...

--
Sylvain

2015-11-10 14:24 GMT+01:00 Sylvain Henry <hsyl20 at gmail.com>:

> 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/a73ce130/attachment.html>


More information about the Beginners mailing list