Excellent bikeshedding opportunity! Frontend syntax for pattern synonym types
carette at mcmaster.ca
Sun Dec 22 14:29:10 UTC 2013
[Superb summary of pattern synonyms omitted]
On 2013-12-22 9:09 AM, Dr. ERDI Gergo wrote:
> The one idea I've had so far is to separate (4), (3) and (5) with two
> double arrows:
> pattern P :: (Show t) => b -> T t => (Num t, Eq b)
pattern P :: (Show t) => ( (Num t, Eq b) => b -> T t )
perhaps? Given 'Show t', you get what's on the rhs of the first => ?
Another idea is
pattern P :: (Show t) ~> (Num t, Eq b) => b -> T t
which has the drawback of introducing a new 'keyword'.
> As an added extra problem, there are also unidirectional and
> bidirectional pattern synonyms: unidirectional ones are usable only as
> patterns, whereas bidirectional ones can also be used as expressions.
> For example:
> pattern Single x = [x]
> pattern Second x <- (_:x:_)
> in this example, `Single` is bidirectional and `Second` is
> unidirectional. As you can see, this is indicated by syntax in the
> definition (`=` vs `<-`). However, I'd like to show this in the type
> as well, since you'd need to be able to see if you can use a given
> pattern synonym as a "constructor", not just a "destructor", by just
> looking at its Haddock-generated docs.
Since the first is an iso, why not
pattern Single :: t a ~ [ a ]
pattern Single :: t a <-> [ a ]
? [I definitely prefer the first] Or is your 'type' for Single somehow
different than my guess?
More information about the Glasgow-haskell-users