<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;">Hi all,<br><br>Thanks. I think I've got it. It nice to have come far enough with this to be thinking about how the pieces fit together. One more question:<br><br>Since<br><br>&nbsp; do s1<br>&nbsp;&nbsp;&nbsp;&nbsp; s2<br>&nbsp;&nbsp;&nbsp;&nbsp; let x1 = e1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 = e2<br>&nbsp;&nbsp;&nbsp;&nbsp; s3<br>&nbsp;&nbsp;&nbsp;&nbsp; s4<br><br>becomes<br><br>&nbsp; do s1<br>&nbsp;&nbsp;&nbsp;&nbsp; s2<br>&nbsp;&nbsp;&nbsp;&nbsp; let x1 = e1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 = e2 in do s3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s4<br><br>Then,<br><br>&nbsp; do s1<br>&nbsp;&nbsp;&nbsp;&nbsp; s2<br>&nbsp;&nbsp;&nbsp;&nbsp; let x1 = e1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 =
 e2<br>&nbsp;&nbsp;&nbsp;&nbsp; s3<br>&nbsp;&nbsp;&nbsp;&nbsp; s4<br>&nbsp;&nbsp;&nbsp;&nbsp; let x3 = e3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x4 = e4<br>&nbsp;&nbsp;&nbsp;&nbsp; s5<br>&nbsp;&nbsp;&nbsp;&nbsp; s6<br><br>becomes<br><br>&nbsp; do s1<br>&nbsp;&nbsp;&nbsp;&nbsp; s2<br>&nbsp;&nbsp;&nbsp;&nbsp; let x1 = e1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 = e2 in do s3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s4<br>&nbsp;&nbsp;&nbsp;&nbsp; let x3 = e3<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x4 = e4 in do s5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s6?<br><br><br>Michael<br><br><br><br><br>--- On <b>Tue, 8/10/10, Tillmann Rendel <i>&lt;rendel@Mathematik.Uni-Marburg.de&gt;</i></b> wrote:<br><blockquote style="border-left: 2px
 solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: Tillmann Rendel &lt;rendel@Mathematik.Uni-Marburg.de&gt;<br>Subject: Re: [Haskell-cafe] Couple of questions about *let* within *do*<br>To: "michael rice" &lt;nowgate@yahoo.com&gt;<br>Cc: haskell-cafe@haskell.org<br>Date: Tuesday, August 10, 2010, 1:35 PM<br><br><div class="plainMail">michael rice wrote:<br>&gt; OK, then there's also an implicit *in* after the *let* in this code. <br><br>If you want to understand let statements in terms of let ... in ... expressions, you can do the following transformation:<br><br>&nbsp; do s1<br>&nbsp; &nbsp;&nbsp;&nbsp;s2<br>&nbsp; &nbsp;&nbsp;&nbsp;let x1 = e1<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;x2 = e2<br>&nbsp; &nbsp;&nbsp;&nbsp;s3<br>&nbsp; &nbsp;&nbsp;&nbsp;s4<br><br>becomes<br><br>&nbsp; do s1<br>&nbsp; &nbsp;&nbsp;&nbsp;s2<br>&nbsp; &nbsp;&nbsp;&nbsp;let x1 = e1<br>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;x2 = e2 in do s3<br>&nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;s4<br><br>So in a sense, there is an implicit "in do".<br><br>&gt; Must the implicit (or explicit) *in* actually use the calculated value(s)?<br><br>No.<br><br>By the way, note that lazy evaluation applies, so the expressions bound in the let may or may not be evaluated, depending on the rest of the program.<br><br>&gt; And, the monad can "continue on" after the *let* (with or without the *in*) as below, i.e., the *let* needn't be the last statement in the *do*?<br><br>Yes, there can be more statements after the let statement. In fact, the let statement must not be the last statement in the do-expression, because a do-expression has to end with an expression statement. Otherwise, what would the result of the do-expression be?<br><br>&nbsp; Tillmann<br></div></blockquote></td></tr></table><br>