<div dir="ltr"><div>Disclaimer: My understanding of this may be out of date/incomplete. My understanding of Haskell typing is largely based on <a href="https://web.cecs.pdx.edu/~mpj/thih/thih.pdf">https://web.cecs.pdx.edu/~mpj/thih/thih.pdf</a> which is old and doesn't contain RankNTypes.</div><div><br></div><div>1)</div><div><br></div><div>Why wouldn't it compile?</div><div><br></div><div>"C => T" means (or is equivalent to) "A function which takes an implicit parameter C and returns a T". There's no particular reason this can't show up on the RHS of a "->" arrow.</div><div><br></div><div>Admittedly, no one really uses typeclasses in this way, but it's not fundamentally wrong.</div><div><br></div><div>2)</div><div><br>I don't believe the former interpretation of baz is valid. The "a" on its own and the one in "Show a" ought to be unified.</div><div><br></div><div>When you quantify an unquantified type, you do it over the *entire* type, not just the variables that show up in constraints. There's no reason you would insert a "forall" in the RHS of an arrow.</div><div><br></div><div>--Will</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 15, 2017 at 4:09 PM, Al Zohali <span dir="ltr"><<a href="mailto:zohl@fmap.me" target="_blank">zohl@fmap.me</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Cafe!<br>
<br>
I've encountered quite strange behaviour in GHC (v8.0.2) and I would<br>
like to ask you to give me a hint.<br>
<br>
Suppose we have the following functions:<br>
----<br>
foo :: (Show a) => Int -> a -> [String]<br>
foo n = replicate n . show<br>
<br>
bar :: Int -> (Show a) => a -> [String]<br>
bar n = replicate n . show<br>
<br>
baz :: Int -> a -> (Show a) => [String]<br>
baz n = replicate n . show<br>
----<br>
<br>
This won't compile, and that is ok. But if we add `RankNTypes`<br>
extension, this will compile and (:t) will give us the same signature<br>
for all three functions.<br>
<br>
There are two things I cannot get:<br>
<br>
1) Why do this even compile?<br>
I saw constraints being defined either in the beginning of a signature<br>
or right after `forall` expression. I thought that it was a rule (or<br>
convention), but it's not. Is this way of declaring constraints (in<br>
the middle of a signature) discouraged or can be considered as a bug?<br>
<br>
2) Even if this was supposed to be so, why was the constraint in `baz`<br>
hoisted to the top?<br>
There are at least two ways to interpret that signature:<br>
----<br>
baz :: Int -> a -> forall a. (Show a) => [String]<br>
baz :: forall a. (Show a) => Int -> a -> [String]<br>
----<br>
Is there any reason why the second one was chosen?<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div><br></div>