<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 29, 2021, at 1:19 PM, Edward Kmett <<a href="mailto:ekmett@gmail.com" class="">ekmett@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">If this is just about GHC internals, then by all means carry on.</div></div></blockquote><div><br class=""></div><div>Yes, I should have clarified: this is just and solely about GHC internals! I have no designs on suggesting a wider convention like this. Indeed, both of the designs you describe below make great sense to use pattern synonyms for -- and without any herald that you are doing so. Within GHC, however, we now have a few cases where pattern synonyms are effectively behaving like or-patterns, which I find unexpected and confusing without a marker telling me Something Unusual is going on.</div><div><br class=""></div><div>(Why? Because in both cases, the pattern synonym is really designed to act like a constructor. In the first case, if I understand correctly, the pattern synonym is just a renaming of an existing constructor, with no extra computation. In the second case, if I understand correctly, the pattern synonym captures what used to be a constructor. It's plausible that GHC will want to adopt either of these patterns at some point in the future, but we do not do either one today, and so I would say to address any change to my proposed coding convention when this happens.)</div><div><br class=""></div><div>Richard</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">-Edward</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Dec 29, 2021 at 12:19 PM Edward Kmett <<a href="mailto:ekmett@gmail.com" class="">ekmett@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class=""><div class="">Please no.</div><div class=""><br class=""></div><div class="">I use them to pun constructors between multiple types that will be in scope at the same time, (e.g. when I have 8 Var constructors on different types in scope between my core language term language and type language...) and often overload them on classes. I can't write the pragma, and the PS_ destroys any utiity I get from any common name.<br class=""></div><div class=""><br class=""></div><div class="">I use them as a migration guide, when I add functionality. PS_ destroys that usecase, but then COMPLETE pragmas are a hacky mess in their current state and often simply can't be applied.</div><div class=""><br class=""></div><div class="">All the existing pattern constructors in the lens library would fail either bar.</div><div class=""><br class=""></div><div class="">So I have to say, either of these would probably destroy <i class="">every</i> use of pattern synonyms I use today.</div><div class=""><br class=""></div><div class="">-Edward</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Dec 29, 2021 at 11:55 AM Richard Eisenberg <<a href="mailto:lists@richarde.dev" target="_blank" class="">lists@richarde.dev</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">Hi devs,<div class=""><br class=""></div><div class=""><div class="">Maybe I'm just old fashioned, but I've come to find pattern synonyms really confusing. Because pattern synonyms will tend to appear next to proper data constructors in code (and they look just like data constructors), when I see one, I think it *is* a data constructor. This problem was motivated by a recent MR that introduces a <a href="https://gitlab.haskell.org/ghc/ghc/-/merge_requests/7261/diffs#7dcf5b567a6cd3c9d98cf8d57323fbca1b1536e9_1128_1130" target="_blank" class="">new pattern synonym</a> that caught me off-guard.</div><div class=""><br class=""></div><div class="">So, I'd like to propose the following convention: Every pattern synonym satisfies one of the following two criteria:</div><div class="">1. The pattern synonym is a member of a set of synonyms/constructors that expresses a view of a type. There would naturally be a `COMPLETE` pragma including the set. `GHC.Types.Var.Inferred` is an example.</div><div class="">2. The pattern synonym begins with the prefix `PS_`.</div><div class=""><br class=""></div><div class="">In the end, I'd probably prefer just (2). With Inferred, for example, I've been caught in the past trying to figure just what the constructors of ArgFlag were (there seemed to be too many), until I realized what was going on.</div><div class=""><br class=""></div><div class="">Pattern synonyms are useful abstractions. I like them. But my mental model of a pattern match is that it matches the structure of the scrutinee and performs no computation. Pattern synonyms violate both of these assumptions, and so (as a reader) I like to know when to put these assumptions to the side.</div><div class=""><br class=""></div><div class="">Future IDE support that could, say, color pattern synonyms differently to regular constructors would obviate the need for this convention.</div></div><div class=""><br class=""></div><div class="">What do others think here? `PS_` is ugly. I don't need something quite so loud and ugly, but it's also easy to remember and recognize.</div><div class=""><br class=""></div><div class="">Thanks!</div><div class="">Richard</div></div>_______________________________________________<br class="">
ghc-devs mailing list<br class="">
<a href="mailto:ghc-devs@haskell.org" target="_blank" class="">ghc-devs@haskell.org</a><br class="">
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank" class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br class="">
</blockquote></div>
</blockquote></div>
</div></blockquote></div><br class=""></body></html>