Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: Python's collections.defaultdict(list) in Haskell?
(Sylvain Henry)
2. Re: Python's collections.defaultdict(list) in Haskell?
(Sylvain Henry)
----------------------------------------------------------------------
Message: 1
Date: Tue, 10 Nov 2015 14:24:35 +0100
From: Sylvain Henry <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Python's
collections.defaultdict(list) in Haskell?
Message-ID:
<capmptcuhzsxdfohe4soo5npxuosztfwpzfan4+0jgu9u1s1...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
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 <[email protected]>:
>
> 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 <[email protected]> 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 <[email protected]>:
>>
>>>
>>> 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
>>> [email protected]
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>>
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>
>
> --
> Dan Stromberg
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> 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-0001.html>
------------------------------
Message: 2
Date: Tue, 10 Nov 2015 14:30:15 +0100
From: Sylvain Henry <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Python's
collections.defaultdict(list) in Haskell?
Message-ID:
<CAPmptcWMjWXBto3h3_gNtC=iagcp08ekastfmdulrp1p9ha...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
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 <[email protected]>:
> 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 <[email protected]>:
>
>>
>> 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 <[email protected]> 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 <[email protected]>:
>>>
>>>>
>>>> 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
>>>> [email protected]
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> [email protected]
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>>
>>
>>
>> --
>> Dan Stromberg
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> 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-0001.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 89, Issue 15
*****************************************