 <p>Isn't what you want to implement the <a href="http://hackage.haskell.org/package/base-4.8.0.0/docs/src/GHC-List.html#scanl1" rel="nofollow"><code>scanl1</code></a> function? I'm a beginner too, but from what I understood, it goes like this:</p> <pre><code>scanl1 :: (a -&gt; a -&gt; a) -&gt; [a] -&gt; [a] scanl1 f (x:xs) = scanl f x xs scanl1 _ [] = [] </code></pre> <p>The <code>scanl</code> function. which <code>scanl1</code> uses, goes like this:</p> <pre><code>scanl :: (b -&gt; a -&gt; b) -&gt; b -&gt; [a] -&gt; [b] scanl = scanlGo where scanlGo :: (b -&gt; a -&gt; b) -&gt; b -&gt; [a] -&gt; [b] scanlGo f q ls = q : (case ls of [] -&gt; [] x:xs -&gt; scanlGo f (f q x) xs) </code></pre> <p>Here's what <a href="http://hackage.haskell.org/package/base-4.8.0.0/docs/Prelude.html#v:scanl" rel="nofollow">hackage</a> has to say about <code>scanl</code>:</p> <pre><code>scanl :: (b -&gt; a -&gt; b) -&gt; b -&gt; [a] -&gt; [b] Source </code></pre> <p><code>scanl</code> is similar to <code>foldl</code>, but returns a list of successive reduced values from the left:</p> <pre><code>scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...] </code></pre> <p>Note that</p> <pre><code>last (scanl f z xs) == foldl f z xs. </code></pre> <p>So, I guess the flow of execution goes like this:</p> <pre><code>scanl1 (+) [2, 4, 1, 1] scanl (+) 2 [4, 1, 1] scanlGo (+) 2 [4, 1, 1] 2 : scanlGo (+) (+ 2 4) [1, 1] 2 : 6 : scanlGo (+) (+ 6 1] [1] 2 : 6 : 7 : scanlGo (+) (+ 7 1) [] 2 : 6 : 7 : 8 : scanlGo [] 2 : 6 : 7 : 8 : [] [2, 6, 7, 8] </code></pre> <p>The same thing happens with the <code>(*)</code> and the <code>max</code> functions that you mentioned. Hope this helps.</p>