Concrete syntax for pattern synonym type signatures

Simon Peyton Jones simonpj at
Sun Nov 9 19:11:32 UTC 2014

On this thread:

* I'm strongly of the opinion that pattern signatures should start
	pattern P :: ...blah...

  Just like value signatures, the pattern name comes first,
  then a double colon. 

* I really don't like syntax that puts the
  pattern name in the middle.

* It's vital that a GADT constructor should have a signature just
  like a GADT constructor.

* I'm not wedded to ";". I chose it just because it seemed like a 
  grouping operator that binds less tightly than ",".

  A vertical bar would be fine with me.  But:
  I'm a little worried that "(|" is a useful bracketing lexeme,
  already used for arrow syntax, so you might have to put a space
  between the paren and the bar.

* One other possibility would be two => thus
	pattern P :: (Eq b) => (Num a, Eq a) => ...blha...

  If you wanted something which had a "match-required" part but no
  "match-provided" part, you'd end up with
	patter P :: () => (Num a, Eq a) => ...blah...
  which is a little odd, but perhaps no odder than
	pattern P :: ( | Num a, Eq a ) => ...blah...

  This has the considerable merit of requiring no new syntax at all.
  There is the difficulty of remembering which way round the match-required
  and match-provided stuff is, but all versions have that problem.

* We don't need to disturb the syntax for HsType; we can just have
  a parser for this particular form; in effect a modified HsForAll,
  just for pattern type signatures, and probably flattened out into
  the pattern-signature constructor form itself.

Does that help?


| -----Original Message-----
| From: Dr. ERDI Gergo [mailto:gergo at]
| Sent: 09 November 2014 07:56
| To: Simon Peyton Jones
| Cc: GHC Devs
| Subject: RE: Concrete syntax for pattern synonym type signatures
| On Tue, 4 Nov 2014, Simon Peyton Jones wrote:
| >  pattern P :: forall tvs. (match-provided ; match-required) => tau
| >
| > The "; match-required" part is optional, and the "match-provided" part
| might be empty.  So P1 and P2 would look like this:
| >
| >  pattern P1 :: forall a. (; Num a) => b -> (a,b)
| >  pattern P2 :: forall a. (; Num a, Ord a) => a -> a
| Doesn't the ';' look a bit like something that could be incidentially
| introduced by some layout-aware syntax rule? Wouldn't, e.g., '|' be more
| explicit as a separator?
| example:
| pattern P :: forall tvs. (Eq b | Num a, Eq a) => b -> T a

More information about the ghc-devs mailing list