Hi,<br><br>I&#39;m writing my first real Haskell program and I came up with the following code snippet.<br><br>---<br>let x&#39; = x \+ dist \* dir<br>&nbsp;&nbsp;&nbsp; nx&#39; =&nbsp; normal geometry<br>&nbsp;&nbsp;&nbsp; wi = (-1) \* dir <br>&nbsp;&nbsp;&nbsp; in do <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (p, wo) &lt;- brdfCosSampling reflector nx&#39; wi&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let color&#39; = p \** color<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q = min 1 (scalarContribution p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sampler &lt;- biasedCoinSampler q <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (radianceSampler surfaces x&#39; wo (q \* color&#39;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (terminalRadianceSampler surfaces x&#39; nx&#39; ((1-q) \* color&#39;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sampler <br>---<br><br>This works just fine but I don&#39;t like the way I had to indent the code because of alternating lets and dos. <br>
I would like to indent the code more like an imperative code i.e. like this<br><br>---<br>let { <br>&nbsp;&nbsp;&nbsp; x&#39; = x \+ dist \* dir ;<br>&nbsp;&nbsp;&nbsp; nx&#39; =&nbsp; normal geometry ;<br>&nbsp;&nbsp;&nbsp; wi = (-1) \* dir ;<br>} in do {<br>&nbsp;&nbsp;&nbsp; (p, wo) &lt;- brdfCosSampling reflector nx&#39; wi ;<br>
let { <br>&nbsp;&nbsp;&nbsp; color&#39; = p \** color ;<br>&nbsp;&nbsp;&nbsp; q = min 1 (scalarContribution p) ;<br>} in do {<br>&nbsp;&nbsp;&nbsp; sampler &lt;- biasedCoinSampler q <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (radianceSampler surfaces x&#39; wo (q \* color&#39;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (terminalRadianceSampler surfaces x&#39; nx&#39; ((1-q) \* color&#39;)) ;<br>
&nbsp;&nbsp;&nbsp; sampler ;<br>}}<br>---<br><br>but without braces and semicolons. Following works also, but is ugly (and probably less efficient?).<br><br>---<br>do<br>&nbsp;&nbsp;&nbsp; x&#39; &lt;- return $ x \+ dist \* dir <br>&nbsp;&nbsp;&nbsp; nx&#39; &lt;- return $&nbsp; normal geometry <br>
&nbsp;&nbsp;&nbsp; wi &lt;- return $ (-1) \* dir <br>&nbsp;&nbsp;&nbsp; (p, wo) &lt;- brdfCosSampling reflector nx&#39; wi <br>&nbsp;&nbsp;&nbsp; color&#39; &lt;- return $ p \** color <br>&nbsp;&nbsp;&nbsp; q &lt;- return $ min 1 (scalarContribution p) <br>&nbsp;&nbsp;&nbsp; sampler &lt;- biasedCoinSampler q <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (radianceSampler surfaces x&#39; wo (q \* color&#39;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (terminalRadianceSampler surfaces x&#39; nx&#39; ((1-q) \* color&#39;)) <br>&nbsp;&nbsp;&nbsp; sampler <br>---<br><br>Is there some nice trick to do this?<br>