Thomas, Stefan,<br><br>Thanks for a most edifying exchange! i will reflect on this.<br><br>Best wishes,<br><br>--greg<br><br><div><span class="gmail_quote">On 6/28/07, <b class="gmail_sendername">Stefan Holdermans</b> &lt;
<a href="mailto:stefan@cs.uu.nl">stefan@cs.uu.nl</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Thomas,<br><br>&gt;&nbsp;&nbsp; let x = ... in ...
<br>&gt;<br>&gt; is only equal<br>&gt;<br>&gt;&nbsp;&nbsp; do x &lt;- ...; ...<br>&gt;<br>&gt; in the Identity monad.&nbsp;&nbsp;Also, why would &quot;do&quot; be more primitive than<br>&gt; &quot;let&quot;.&nbsp;&nbsp;That way you would have to use monads everywhere.&nbsp;&nbsp;Also,
<br>&gt; let is treated specially by the type checker (IIRC) and there are<br>&gt; many, many other reasons not to do that.<br><br>As you already hinted at in a later message, this has to do with let-<br>bindings being potentially polymorphic and monadic bindings being
<br>necessarily monomorphic:<br><br>&nbsp;&nbsp; import Control.Monad.Identity<br>&nbsp;&nbsp; foo =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let id =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\x -&gt; x&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(id &#39;x&#39;,<br>id 42) -- well-typed<br>&nbsp;&nbsp; bar = runIdentity $ do&nbsp;&nbsp;id &lt;- return (\x -&gt; x) ;&nbsp;&nbsp;return (id &#39;x&#39;,
<br>id 42) -- ill-typed<br><br>Cheers,<br><br>&nbsp;&nbsp; Stefan<br></blockquote></div><br><br clear="all"><br>-- <br>L.G. Meredith<br>Managing Partner<br>Biosimilarity LLC<br>505 N 72nd St<br>Seattle, WA 98103<br><br>+1 206.650.3740
<br><br><a href="http://biosimilarity.blogspot.com">http://biosimilarity.blogspot.com</a>