<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Also, with -XImpredicativeTypes:<br><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">    > (seq :: (forall x. Show x => x) -> b -> b) undefined ()<br>
    ()<br><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Apr 2, 2014 at 9:18 PM, Dan Doel <span dir="ltr"><<a href="mailto:dan.doel@gmail.com" target="_blank">dan.doel@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div class="">On Wed, Apr 2, 2014 at 8:40 PM, Niklas Haas <span dir="ltr"><<a href="mailto:haskell@nand.wakku.to" target="_blank">haskell@nand.wakku.to</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Oh, fair point; this particular F apparently doesn't break it but if you<br>
remove the Show x constraint, it does.<br>
<br>
Actually, is that a bug in GHC?<br>
<br>
> λ newtype F = F (forall x. Show x => x -> String)<br>
> λ F undefined `seq` ()<br>
> ()<br>
> λ undefined `seq` ()<br>
> *** Exception: Prelude.undefined<br>
<br>
I'm not sure how to interpret this output.<br></blockquote></div><div><br><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">This is pretty weird, but here's what I think is going on:<br>

<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">F requires an argument of type forall x. Show x => x -> String. This requires abstracting over a dictionary for Show x. So at the core level, this gets expanded to something like:<br>

<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">   \showd -> undefined<br><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">

which is non-bottom.</div> <div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">Even if you annotate undefined with the above type, You'll probably end up with:<br><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">

    (\showd -> undefined) defaultd `seq` ()<br><br>after GHC reinstantiates the polymorphic type and then defaults, which will be undefined. So you can only observe this by wrapping the polymorphic expression in a newtype, to keep it abstracted.<br>

<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">I don't know that this qualifies as a bug, but it's definitely pretty subtle behavior.<span class="HOEnZb"><font color="#888888"><br>
<br></font></span></div><span class="HOEnZb"><font color="#888888"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;display:inline">
-- Dan</div></font></span></div></div></div></div>
</blockquote></div><br></div>