
#8582: Record syntax for pattern synonyms -------------------------------------+------------------------------------- Reporter: cactus | Owner: mpickering Type: feature request | Status: new Priority: high | Milestone: 8.0.1 Component: Compiler | Version: Resolution: | Keywords: | PatternSynonyms Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: 5144 | Blocking: Related Tickets: | Differential Revisions: Phab:D1152 -------------------------------------+------------------------------------- Comment (by simonpj): I'm sorry but I'm honestly not sure what the specification of the new feature is. The [wiki:PatternSynonyms#Design design subsection] is helpful, but it uses only one example, and I can't tell what is supposed to happen in general. Let's try this. In general, a pattern synonym should behave exactly like its expansion. So given {{{ pattern P x = (x, True) }}} these two functions should behave the same: {{{ f1 (P False) = "yes" f2 (P True) = "no" f2 (False,True) = "yes" -- Replace (P pat) by its expansion f2 (True, True) = "no" }}} (Actually they are not quite the same; see [wiki:PatternSynonyms#DynamicSemantics dynamic semantics subsection]. But close enough for now.) But for your proposal, given {{{ pattern Foo{bar, baz} = (bar, baz) }}} how, exactly should pattern matches on `Foo` expand? I can't tell. Another way to get at this question would be to look at [https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.1... Section 3.17 of the langauge definition]. What changes, precisely, are required to accommodate pattern synonyms? (It's a deficiency in the current user manual that it does not say.) To give the idea, here is my first stab at extending 3.17.2. Add an extra item to the list, saying * To match a pattern `P p1 .. pn` against a value, where `P` is a pattern synonym defined by `pattern P x1 .. xn = prhs`, * first match the pattern `prhs` against the value, thereby binding `x1`..`xn`. * and then match `p1` agianst `x1`, `p2` against `x2`, and so on in sequence. A similar modification to 3.17.3 would be needed. Now, how would you change those words if your proposal was adopted? Thanks. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8582#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler