[ghc-steering-committee] Constructor synonyms, signatures on pattern synonym constructors
Simon Peyton Jones
simonpj at microsoft.com
Wed Mar 22 10:13:00 UTC 2017
Some thoughts
· To me it's clear that we should abandon #41 in favour of #42. Indeed the author did so himself, but then re-opened it saying only "@kosmikus thinks this should be reopened".
I could elaborate, but see the discussion on #41. I think it’s pretty much a consensus.
· For #42, I’m mildly in favour, as I said on the thread. (But no holes please!)
· I agree with Roman that that type of the constructor should be the same as that of the pattern, constrains aside. We can always loosen later if there is well-supported evidence that doing so would be good.
Simon
| -----Original Message-----
| From: ghc-steering-committee [mailto:ghc-steering-committee-
| bounces at haskell.org] On Behalf Of Christopher Allen
| Sent: 21 March 2017 05:55
| To: ghc-steering-committee at haskell.org
| Subject: [ghc-steering-committee] Constructor synonyms, signatures on
| pattern synonym constructors
|
| I’m shepherding this two intertwined proposals, the Github discussions
| are located at:
|
| - https://github.com/ghc-proposals/ghc-proposals/pull/41
| - https://github.com/ghc-proposals/ghc-proposals/pull/42
|
| The rendered proposals are located at time of review at:
|
| - https://github.com/treeowl/ghc-<https://github.com/treeowl/ghc-proposals/blob/680d909a07b10b6a37a64adf174ee845783dc2a4/proposals/0000-constructor-synonyms.rst>
| proposals/blob/680d909a07b10b6a37a64adf174ee845783dc2a4/proposals/0000<https://github.com/treeowl/ghc-proposals/blob/680d909a07b10b6a37a64adf174ee845783dc2a4/proposals/0000-constructor-synonyms.rst>
| -constructor-synonyms.rst<https://github.com/treeowl/ghc-proposals/blob/680d909a07b10b6a37a64adf174ee845783dc2a4/proposals/0000-constructor-synonyms.rst>
| - https://github.com/treeowl/ghc-<https://github.com/treeowl/ghc-proposals/blob/559df2865db8e4427b1f24d3100e59d61cb60e54/proposals/0000-bidir-constr-sigs.rst>
| proposals/blob/559df2865db8e4427b1f24d3100e59d61cb60e54/proposals/0000<https://github.com/treeowl/ghc-proposals/blob/559df2865db8e4427b1f24d3100e59d61cb60e54/proposals/0000-bidir-constr-sigs.rst>
| -bidir-constr-sigs.rst<https://github.com/treeowl/ghc-proposals/blob/559df2865db8e4427b1f24d3100e59d61cb60e54/proposals/0000-bidir-constr-sigs.rst>
|
| Very briefly,
|
| Proposal #41 is constructor synonyms. This would allow users to define
| variables with capitalized names and operators that begin with colons.
| They are meant to complement pattern synonyms. This example from the
| rendered proposal captures the idea and complementarity well I think:
|
|
| pattern NF :: a -> NF a
| pattern NF a <- UnsafeNF a
|
| constructor NF :: NFData a => a -> NF a
| constructor NF a = a `deepseq` UnsafeNF a
|
| pattern Zero :: (Eq a, Num a) => a
| pattern Zero <- ((== 0) -> True)
|
| constructor Zero :: Num a => a
| constructor Zero = 0
|
| Proposal #42 would add type signatures for bidirectional pattern
| synonym constructor functions. Currently we can write this:
|
| pattern Zero :: (Num a, Eq a) => a
| pattern Zero <- ((== 0) -> True)
| where
| Zero = 0
|
| Per Feuer:
|
| >The trouble in this case is that the Eq constraint from the pattern
| "infects" the constructor. So if I have a number type I can't test for
| equality, I can't use Zero to construct it.
|
| It would permit writing things like this instead:
|
| pattern Zero :: (Eq a, Num a) => a
| pattern Zero <- ((== 0) -> True) where
| Zero :: Num a => a -- optional
| Zero = 0
|
| This would prevent the pattern’s Eq constraint from “infecting” using
| Zero as a constructor, which doesn’t actually need Eq.
|
|
| — My thoughts follow —
|
| I think Richard’s right about how we’ll need to handle compatibility.
| I agree that the current warnings policy is a bit restrictive but it’s
| not worth getting people riled up over it.
|
| I agree with Simon's comment on #42. I think we need to take seriously
| whether or not this proposal compromises the use-case of the naïve
| user consuming a library API that uses pattern constructors. Partly
| why I feel this is important is that as much debate as it draws,
| Haskell users consuming a lens-based API are able to cargo cult and
| move on with what they’re doing. I think pattern constructors should
| be held to a higher usability standard than lens due to looking like
| data constructors and being baked into the implementation.
|
| This seems to clear up a limitation in expressiveness with few
| downsides as long as we avoid using holes and respect the community’s
| desires on backwards compatibility. Avoiding holes should make
| implementation easier and have fewer unpredictable behaviors down the
| road as well.
|
|
| — My recommendation for the proposal —
|
| My recommendation is that we accept both proposals. My reservation
| would be that it shouldn't have serious downsides for the existing
| users of pattern synonyms, be they authors or consumers.
|
|
| Cheers,
| Chris
| _______________________________________________
| ghc-steering-committee mailing list
| ghc-steering-committee at haskell.org<mailto:ghc-steering-committee at haskell.org>
| https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-<https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee>
| committee<https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-steering-committee/attachments/20170322/b096f69b/attachment-0001.html>
More information about the ghc-steering-committee
mailing list