<br><div class="gmail_quote">On 2 March 2010 15:44, Luke Palmer <span dir="ltr">&lt;<a href="mailto:lrpalmer@gmail.com">lrpalmer@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im">On Tue, Mar 2, 2010 at 1:17 PM, David Sabel<br>
&lt;<a href="mailto:sabel@ki.informatik.uni-frankfurt.de">sabel@ki.informatik.uni-frankfurt.de</a>&gt; wrote:<br>
&gt; Hi,<br>
&gt; when checking the first monad law (left unit) for the IO-monad (and also for<br>
&gt; the ST monad):<br>
&gt;<br>
&gt; return a &gt;&gt;= f ≡ f a<br>
&gt;<br>
&gt; I figured out that there is the &quot;distinguishing&quot; context (seq [] True) which<br>
&gt; falsifies the law<br>
&gt; for a and f defined below<br>
&gt;<br>
&gt;<br>
&gt;&gt; let a = True<br>
&gt;&gt; let f = \x -&gt; (undefined::IO Bool)<br>
&gt;&gt; seq (return a &gt;&gt;= f) True<br>
&gt; True<br>
&gt;&gt; seq (f a) True<br>
&gt; *** Exception: Prelude.undefined<br>
&gt;<br>
&gt; Is there a side-condition of the law I missed?<br>
<br>
</div>No, IO just doesn&#39;t obey the laws.  However, I believe it does in the<br>
seq-free variant of Haskell, which is nicer for reasoning.  In fact,<br>
this difference is precisely what you have observed: the<br>
distinguishing characteristic of seq-free Haskell is that (\x -&gt;<br>
undefined) == undefined, whereas in Haskell + seq, (\x -&gt; undefined)<br>
is defined.<br>
<br></blockquote><div><br>In GHC 6.12.1 both expressions reduce to True, but it doesn&#39;t happen  in GHC 6.10.4. Any ideas why the behaviour is different?<br></div></div><br>-- <br>Andrés<br>