Redundant `let`s in list monadic code
Hm, this could probably be done using foldM or similar, but that would require you to convert to and from lists. My first impulse would be to try to write the top-level of example using Applicative style:

import Control.Applicative

example = head $ (,,,,) &lt;$&gt; m &lt;*&gt; m &lt;*&gt; m &lt;*&gt; m &lt;*&gt; m


But that doesn't work directly here, as you want each m to know the list# of the last action.

One way to realize this without breaking up the above structure would be to have a StateT monad transformer take care of passing around the current list#:

import Control.Monad.State

example = head $ flip evalStateT [0,1] $
          (,,,,) &lt;$&gt; m &lt;*&gt; m &lt;*&gt; m &lt;*&gt; m &lt;*&gt; m


This allows us to write m as a list monad with state:

  where m :: StateT [Int] [] Int
        m = do list &lt;- get
               e &lt;- lift list
               put (phi list e)
               return e


Now admittedly, this is a bit advanced. It might be easier to try to restructure phi or use a foldM type solution.