<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>