<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>Some comments in-line :)<br>
Best, <br>
Kai Prott<br>
</p>
<blockquote type="cite" cite="mid:CABU_mxinuS1gFdSQznu05cU+D4HroQ_eEmN393f6oHKUTR9VmA@mail.gmail.com"><br>
<div dir="ltr">
<div><font face="arial, sans-serif">> <span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">pattern Any2 :: forall . forall a. a -> Some</span></font></div>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">We're friends here. I think I can share that my reaction was a rather loud WTF??!!??</font></pre>
</div>
</blockquote>
Yep, that is quite weird. <br>
<blockquote type="cite" cite="mid:CABU_mxinuS1gFdSQznu05cU+D4HroQ_eEmN393f6oHKUTR9VmA@mail.gmail.com">
<div dir="ltr">
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">And there's not a mention in the docos that this is even a thing. I feel like dragging whoever's responsible to the headmaster's office.</font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">Ok that seems to work -- in the sense that pattern-matching on it yields an `x` that's unusable on RHS just as much as the `Any` decl with implicit `forall`, or with no type signature at all.</font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">What would be useful is to be able to introduce a constraint into the sig, so I can do something like</font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> foo (Any2 x) y = x == y</font></pre>
</div>
</blockquote>
<blockquote type="cite" cite="mid:CABU_mxinuS1gFdSQznu05cU+D4HroQ_eEmN393f6oHKUTR9VmA@mail.gmail.com">
<div dir="ltr">
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">After playing with it, all I'm getting is weird rejections. </font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> pattern Any2 :: forall . forall a. () => (Eq a) => a -> Some</font></pre>
</div>
</blockquote>
<p><font face="arial, sans-serif">Your first error message seems
like a case of bad error messages. <br>
Just out of curiosity, I've tried writing the following: <br>
</font></p>
<p><font face="arial, sans-serif">pattern Refl :: forall a. forall .
() => (Eq a) => Bool -> a<br>
pattern Refl a <- (refl -> a)<br>
<br>
refl :: Eq a => a -> Bool <br>
refl a = a == a</font></p>
<p><font face="arial, sans-serif">This should not be accepted.
Indeed I get the error message with "fewer arrows", although it
seems like the given type signature has exactly the number of
arrows it needs. The problem here is the misplaced constraint. <br>
GHC checks the arity of `Eq a => Bool -> a`, which it
argues has zero arrows (->) at the top of the type. <br>
Note that the correct type signature would be <br>
</font></p>
<p><font face="arial, sans-serif">pattern Refl :: forall a. (Eq a)
=> forall . () => Bool -> a</font></p>
<blockquote type="cite" cite="mid:CABU_mxinuS1gFdSQznu05cU+D4HroQ_eEmN393f6oHKUTR9VmA@mail.gmail.com">
<div dir="ltr">
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">
</font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> * Pattern synonym `Any2' has one argument
> but its type signature has 1 fewer arrows
</font></pre>
<pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">I need to put the constraints inside the scope of the `forall a.`. A single `(Show a) => a -> Some` complains no instance provided.</font></pre>
</div>
</blockquote>
<p><font face="arial, sans-serif">The problem here is, that `Some`
does not carry around any information that its argument has an
`Eq` instance. It was not declared with such a constraint. Thus,
pattern matching on `Some` cannot bring any `Eq` instance into
scope. This is what the second error is trying to tell you.
`Some` does not carry around enough information for `Any` to
provide an `Eq` constraint when pattern matched. </font></p>
<p><font face="arial, sans-serif">
And as a quick note: Even if we do define `Some :: Eq a => a
-> Some` your example still does not work, since x and y are
not guaranteed to be of the same type. But we could write: <br>
</font></p>
<p><font face="arial, sans-serif">data Some where <br>
Some :: Eq a => a -> Some <br>
</font></p>
<p><font face="arial, sans-serif">pattern Any2 :: forall . forall a.
(Eq a) => a -> Some<br>
pattern Any2 a = Some a<br>
</font></p>
<p><font face="arial, sans-serif">foo :: Some -> Bool <br>
foo (Any2 x) = x == x</font></p>
<blockquote type="cite" cite="mid:CABU_mxinuS1gFdSQznu05cU+D4HroQ_eEmN393f6oHKUTR9VmA@mail.gmail.com">
<div dir="ltr"><font face="arial, sans-serif"><br class="gmail-Apple-interchange-newline">
</font>
<div><br>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
<a class="moz-txt-link-freetext" href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a>
Only members subscribed via the mailman list are allowed to post.</pre>
</blockquote>
</body>
</html>