<div dir="auto"><div>Fwiw, a less contrived, and much more relatable, version of Richard's example would be<div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">pattern Is3 :: (Num a, Eq a) => a   -- only a Required constraint</div><div dir="auto">pattern Is3 = 3 -- a polymorphic literal!</div><div dir="auto"><br></div><div dir="auto">I think it can be quite instructive for people new to patsyn typing to work out why this is exactly the same as the one in Richard's email!</div><div dir="auto"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jan 6, 2022, 21:11 Richard Eisenberg <<a href="mailto:lists@richarde.dev">lists@richarde.dev</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><br><div><br><blockquote type="cite"><div>On Jan 5, 2022, at 9:19 PM, Anthony Clayden <<a href="mailto:anthony.d.clayden@gmail.com" target="_blank" rel="noreferrer">anthony.d.clayden@gmail.com</a>> wrote:</div><br><div><div style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><font face="monospace">So Pattern syns seem to be giving exactly the 'stupid theta' behaviour.</font></div></div></blockquote><div><br></div><div>In your example, yes: the Required context is "stupid" in the way that "stupid theta" is. The reason to have a Required context is if your pattern synonym does computation that requires a constraint. For example:</div><div><br></div><div>pattern Is3 :: (Num a, Eq a) => a   -- only a Required constraint</div><div>pattern Is3 = ((==) 3 -> True)   -- that's a view pattern</div><div><br></div><div>In your case, there is no computation (your pattern synonym just stands for a constructor), so the Required context is unhelpful (and does indeed act just like a datatype context).</div><br><blockquote type="cite"><div><div style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><font face="monospace"><br></font></div><div style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><font face="monospace">The User Guide <a href="https://downloads.haskell.org/~ghc/8.10.7/docs/html/users_guide/glasgow_exts.html#typing-of-pattern-synonyms" target="_blank" rel="noreferrer">https://downloads.haskell.org/~ghc/8.10.7/docs/html/users_guide/glasgow_exts.html#typing-of-pattern-synonyms</a><span> </span>says</font></div><div style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><font face="monospace"><br></font></div><ul style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><li><div style="margin:0px"><font face="monospace">⟨CProv⟩ are the constraints <em>made available (provided)</em> by a successful pattern match.</font></div></li></ul><div style="font-family:Helvetica;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration:none"><font face="monospace"><font><span style="font-size:14px">But it doesn't mean that. It's more like "</span></font><span style="font-size:14px">⟨CProv⟩ are the constraints made available *in addition to </span><span style="font-size:14px">⟨CReq⟩* (provided union required) by a successful pattern match."</span></font></div></div></blockquote><br></div><div>I agree with the user guide here: the Provided constraints are made available. The Required constraint must *already* be available before the pattern match, so they are not made available *by* the match. It is true, though, that in the context of the match, both the Provided and the Required constraints must be satisfiable.</div><div><br></div><div>To get the pre-1999 behavior, you would need a different type for a pattern synonym used as a pattern than for one used as an expression. This is the subject of the accepted-but-not-implemented <a href="https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0042-bidir-constr-sigs.rst" target="_blank" rel="noreferrer">https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0042-bidir-constr-sigs.rst</a></div><div><br></div><div>Richard</div><br></div>_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank" rel="noreferrer">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
</blockquote></div></div></div>