Pattern synonym type flexibility

David Feuer david.feuer at
Wed Apr 20 17:33:05 UTC 2016

To some degree, it probably could be. But I believe that imposing any
substantial relationship between the smart constructor and the pattern
synonym is likely to fall squarely into the category of things that are
subtle, hard, and almost completely useless. In the arrangement I
suggested, people would be free to do some things that "don't make sense",
and that doesn't bother me in the least.
On Apr 20, 2016 1:27 PM, "Carter Schonwald" <carter.schonwald at>

> Would that duality be related to the given vs wanted constraints ?
> On Wednesday, April 20, 2016, David Feuer <david.feuer at> wrote:
>> 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.
>> _______________________________________________
>> ghc-devs mailing list
>> ghc-devs at
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the ghc-devs mailing list