
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.