[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
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to