<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: 16px arial; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0">I&#39;m also learning Haskell so the solution below might be (1) inefficient and (2) incorrect, but hey, let&#39;s give it a try :-) 
<div><br></div>
<div>For simplicity, in the testing code, I assume an infinite list of key/value pairs where they keys are of type Char between &#39;a&#39; and &#39;z&#39; and the values are Integers (the code also seems to work for keys with just a lower bound but no upper bound)</div>

<div> </div>
<div>I think the code speaks for itself</div>
<div><br></div>
<div>
<div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2">import System.Random</font></span></span></div>

<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2"></font></span></span> </div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2">runningSumsOfValuesPerKey :: (Eq k, Num v) =&gt; [k] -&gt; [(k, v)] -&gt; [[v]]<br>
runningSumsOfValuesPerKey allPossibleKeys = runningSums . allValuesPerKey<br>  where<br>    runningSums = map (scanl (+) 0)<br>    allValuesPerKey pairs = [ valuesWithKey key pairs | key &lt;- allPossibleKeys ]<br>    valuesWithKey key = map snd . filter ((==key) . fst) </font></span></span></div>

<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2"></font></span></span> </div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2">-- Testing<br>randomPairs :: [(Char, Integer)]<br>
randomPairs = zip keys values<br>  where<br>    keys        = randomRs (&#39;a&#39;,&#39;z&#39;) rnd1<br>    values      = randomRs (0,9) rnd2<br>    (rnd1,rnd2) = split (mkStdGen 0)</font></span></span></div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font size="2"></font></span></span> </div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><font face="courier new,monospace" size="2">test = map (take 10) [rs `atKey` &#39;c&#39;, rs `atKey` &#39;z&#39;]<br>
  where<br>    rs = runningSumsOfValuesPerKey [&#39;a&#39;..] randomPairs<br>    xs `atKey` k = xs !! (fromEnum k - fromEnum &#39;a&#39;)<br>    <br></font></span></span></div></div>
<div>
<div><span class="Apple-style-span" style="FONT-FAMILY: &#39;courier new&#39;, monospace"><span class="Apple-style-span" style="FONT-SIZE: large"><br><font size="2"></font></span></span></div>
<div><font size="2"><br></font></div></div></div></span><br class="Apple-interchange-newline">