<div class="gmail_quote">On Sat, Sep 8, 2012 at 4:49 PM, Iain Nicol <span dir="ltr">&lt;<a href="mailto:iain@thenicols.net" target="_blank">iain@thenicols.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
I think I&#39;m trying to lift &#39;Data.List.intersperse&#39; (to applicative or a<br>
monad) in such a way that its (first) argument is recomputed each time<br>
it is used.  I&#39;m hoping that there&#39;s a reusable, elegant or abstract,<br>
approach for this that I&#39;m unaware of.<br></blockquote></div><br>Instead of using intersperse, just generate two list and interlace them (interlace is easy to write, though not in Data.List :<br><br>&gt; interlace (x:xs) (y:ys) = x : y : interlace xs ys<br>
&gt; interlace xs [] = xs<br>&gt; interlace [] ys = ys<br>&gt; <br>&gt; listOfN n g = replicateM n g<br>&gt; <br>&gt; mixIntersperse genSep genWord = do<br>&gt;   n &lt;- arbitrary<br>&gt;   ws &lt;- listOfN n genWord<br>
&gt;   ss &lt;- listOfN (n-1) genSep<br>&gt;   return $ interlace ws ss<br><br>That seems more elegant to me but you&#39;ll judge :)<br><br>-- <br>Jedaï<br>