so... this is likely a question based on serious misunderstandings, but can anyone help me understand the exact mechanism by which monads enforce sequencing?  Specifically, I'm confused by the >> operator.  If I understand things properly f a >> g expands to something like:
<br><br>f &gt;&gt;= \_ -&gt; g<br><br>What I&#39;m missing is how the expansion of f is ever forced under lazy evaluation.&nbsp; Since the result is never used, doesn&#39;t it just stay as a completely unevaluated thunk?&nbsp; Come to think of it... how is it that some IO actions sequence completely, while others manage to work in a lazy manner?&nbsp; My suspicion is that somehow the order of evaluation in Haskell gives the outermost expression a &quot;first crack&quot; at evaluation in all circumstances (
e.g. <a href="http://users.aber.ac.uk/afc/stricthaskell.html#cps">http://users.aber.ac.uk/afc/stricthaskell.html#cps</a>) , but that it somehow stops short of a forced deep sequencing...&nbsp; Which is all to say, I have no idea how the magic happens.
<br><br>-David<br><br>