bind is no more a sequencing operator than function composition is. Just as the order in which you pass two functions (ignoring the type issue for the moment) matters, the order in which you pass things to bind matters. The sense in which the order _doesn&#39;t_ matter is that of the order in which what you pass gets evaluated.<br>
<br><div class="gmail_quote">On Thu, Feb 5, 2009 at 3:32 PM, Jake McArthur <span dir="ltr">&lt;<a href="mailto:jake@pikewerks.com">jake@pikewerks.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
-----BEGIN PGP SIGNED MESSAGE-----<br>
Hash: SHA1<br>
<br>
<a href="mailto:mail@justinbogner.com" target="_blank">mail@justinbogner.com</a> wrote:<br>
| Jake McArthur &lt;<a href="mailto:jake@pikewerks.com" target="_blank">jake@pikewerks.com</a>&gt; writes:<br>
|&gt; The problem with your description is that you said &quot;and then.&quot; The<br>
|&gt; result will be generated lazily. There is no sequencing here. Consider:<br>
|&gt;<br>
|&gt; ~ &nbsp; &nbsp;do x &lt;- [0..]<br>
|&gt; ~ &nbsp; &nbsp; &nbsp; y &lt;- [0..9]<br>
|&gt; ~ &nbsp; &nbsp; &nbsp; return (x, y)<br>
|&gt;<br>
|&gt; Which list is generated first?<br>
|&gt;<br>
|<br>
| This is an implementation detail, since y has no dependency on x the<br>
| compiler&#39;s free to reorder instructions, as it would be an imperative<br>
| language. Semantically this means do x and then y<br>
<br>
That the order does not matter is definitely not an implementation<br>
detail. Order not mattering is exactly what declarative programming is<br>
about. The semantics of the above expression are the same as this:<br>
<br>
~ &nbsp; &nbsp;(&lt;$&gt; [0..9]) . (,) =&lt;&lt; [0..]<br>
<br>
There is no &quot;do X and then do Y,&quot; only &quot;this is what I want.&quot;<br>
Declarative semantics. As I said, just because do notation makes it look<br>
imperative doesn&#39;t mean it actually is.<br>
<br>
| Just because the compiler is allowed (and even encouraged) to change the<br>
| sequence where that won&#39;t change the results, considering this a<br>
| sequence is still valid and meaningful.<br>
<br>
It can be helpful sometimes, but I don&#39;t think it should be the standard<br>
way to think of bind. There are too many cases when it makes little<br>
sense as a sequencing operator.<br>
<br>
- - Jake<br>
-----BEGIN PGP SIGNATURE-----<br>
Version: GnuPG v1.4.9 (GNU/Linux)<br>
Comment: Using GnuPG with Mozilla - <a href="http://enigmail.mozdev.org" target="_blank">http://enigmail.mozdev.org</a><br>
<br>
iEYEARECAAYFAkmLTPEACgkQye5hVyvIUKkoCACgz/IYvxa6PoEvuqgxljGAwZ8+<br>
TXQAn30MyLDwhLyZV3+dRuJvttx93ZNh<br>
=P9em<br>
-----END PGP SIGNATURE-----<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>