<div dir="ltr">On Wed, Dec 28, 2016 at 8:07 AM, Olaf Klinke <span dir="ltr"><<a href="mailto:olf@aatal-apotheke.de" target="_blank">olf@aatal-apotheke.de</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'd say the cleanest way to go is to split your Info data structure into an intermediate key and a value part like so:<br>
<br>
type Key = String<br>
data Value = Value {count :: !Int, healthTopics :: ![String]}<br>
<br>
keyvalue :: Info -> (Key,Value)<br>
keyvalue (Info _ h k) = (k,Value 1 [h])<br>
<br>
and give Value a Monoid instance:<br>
<br>
instance Monoid Value where<br>
  mempty = Value 0 []<br>
  mappend (Value c s) (Value c' s') = Value (c+c') (s++s')<br>
<br>
(Or you could use (Sum Int) instead of Int and have<br>
type Value = (Sum Int,[String]).<br>
Then the Monoid instance is derived for you.)<br></blockquote><div><br></div><div>A caution on this alternative: the first component of the tuple won't be strict enough and you'll leak space.  I think the proposed solution is better.  Note that you *don't* necessarily need the strictness annotation on healthTopics – this shifts around when the list append gets run but won't change space much.</div><div><br></div><div>-Jan-Willem Maessen</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Now you can transform a list of Infos into a Map using a generic function:<br>
<br>
makeMap :: [Info] -> M.Map Key Value<br>
makeMap = M.fromListWith mappend . map keyvalue<br>
<br>
Semantically, it's pretty identical to ALeX Kazik's suggestion of using foldl' and alter. Internally, fromListWith uses a strict fold, so strictness should be the same as using foldl'.<br>
<br>
Olaf<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div><br></div></div>