
[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 ] or pattern Single :: t a <-> [ a ] ? [I definitely prefer the first] Or is your 'type' for Single somehow different than my guess? Jacques