<span style="color: rgb(34, 34, 34); font-family: arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255); ">Brent: Thanks for reminding me about (&gt;=&gt;). Far more readable! But regarding the sequence thing: I can think of all sorts of reasons why we&#39;d want to do a single traversal. How about when lst is long or infinite? In general, it&#39;s more useful to produce output incrementally than all at once at the end.</span><div>

<font color="#222222" face="arial, sans-serif"><br clear="all"></font>Mike S Craig<br>(908) 328 8030<br>
<br><br><div class="gmail_quote">On Wed, Sep 14, 2011 at 8:18 PM, Brent Yorgey <span dir="ltr">&lt;<a href="mailto:byorgey@seas.upenn.edu">byorgey@seas.upenn.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">On Wed, Sep 14, 2011 at 06:48:29PM -0400, Michael Craig wrote:<br>
&gt; Say we&#39;ve got these types<br>
&gt;<br>
&gt; lst :: m [a]<br>
&gt; getMB :: a -&gt; m (Maybe b)<br>
&gt; getC :: b -&gt; m c<br>
&gt;<br>
&gt; and we want to map getMB and getC over the elements of lst, all the while<br>
&gt; discarding elements x where getMB x == Nothing.<br>
&gt;<br>
&gt; (This could be generalized more by replacing Maybe with some monad m&#39;, but<br>
&gt; let&#39;s run with Maybe because it&#39;s easy to talk about.)<br>
&gt;<br>
&gt; The best I&#39;ve got (after some help on IRC) is this not-so-easy-to-read<br>
&gt; oneliner:<br>
&gt;<br>
&gt; lst &gt;&gt;= (\x -&gt; mapM (liftM (liftM getC) (getMB x)) &gt;&gt;= sequence<br>
&gt; . catMaybes<br>
<br>
</div>How about this:<br>
<br>
  lst &gt;&gt;= (mapM getMB &gt;=&gt; (return . catMaybes) &gt;=&gt; mapM getC)<br>
<br>
Everyone always forgets about (&gt;=&gt;).<br>
<div class="im"><br>
&gt; This is hard to read, but it&#39;s also bad because we run sequence twice (once<br>
&gt; inside of mapM). If we want to do multiple things to each element of lst, it<br>
&gt; would be nice to process each element completely before moving on to the<br>
&gt; next.<br>
<br>
</div>I wouldn&#39;t worry about running sequence twice.  Processing things by<br>
chaining whole-structure transformations is the Haskell Way (tm).  All<br>
that business about &quot;doing only one traversal&quot; is for people<br>
programming in strict languages to worry about. The compiler can often<br>
turn a chain of wholesale transformations into a single traversal<br>
anyway.  In short, I see no particular reason why it is &quot;nice&quot; to<br>
process each element completely before moving on.  Isn&#39;t it nicer to<br>
be able to think in a more modular style?<br>
<font color="#888888"><br>
-Brent<br>
</font><div><div></div><div class="h5"><br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br></div>