Pattern synonym type flexibility

David Feuer david.feuer at
Wed Apr 20 16:50:07 UTC 2016

As far as I can tell from the 7.10 documentation, it's impossible to
make a bidirectional pattern synonym used as a constructor have a
different type signature than when used as a pattern. Has this been
improved in 8.0? I really want something like

class FastCons x xs | xs -> x where
  fcons :: x -> xs -> xs
class FastViewL x xs | xs -> x where
  fviewl :: xs -> ViewL x xs

pattern x :<| xs <- (fviewl -> ConsL x xs) where
  x :<| xs = fcons x xs

This would allow users to learn just *one* name, :<|, that they can
use for sequences that are consable or viewable even if they may not
be the other.

If this is not yet possible, then I think the most intuitive approach
is to sever the notions of "pattern synonym" and "smart constructor".
So I'd write

pattern x :<| xs <- (fviewl -> ConsL x xs)
constructor (:<|) = fcons

The current syntax could easily be desugared to produce *both* a
pattern synonym and a smart constructor in the bidirectional case.

More information about the ghc-devs mailing list