Rewrapping with simple bidirectional pattern synonyms

Matthew Pickering matthewtpickering at
Wed Aug 24 22:13:29 UTC 2016

The relevant ticket is -

On Wed, Aug 24, 2016 at 11:11 PM, David Feuer <david.feuer at> wrote:
> I'm trying to write a bidirectional pattern synonym which is morally
> simple, but as far as I can tell there's no way to write it as a
> simple bidirectional pattern synonym.
> What I want to say is
> pattern TSnoc (TSnocList xs) x = TSnocList (CL.TCons (Dual x) xs)
> (where TSnocList and Dual are both newtype constructors)
> But I don't see a way to do it without being explicitly bidirectional:
> pattern TSnoc xs x <- (tsViewR -> ViewR xs x) where
>   TSnoc (TSnocList xs) x = TSnocList (CL.TCons (Dual x) xs)
> tsViewR :: TSnocList c x y -> ViewR c (TSnocList c) x y
> tsViewR (TSnocList CL.TNil) = EmptyR
> tsViewR (TSnocList (CL.TCons (Dual x) xs)) = ViewR (TSnocList xs) x
> Would it be possible to make this simple thing simple?
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at

More information about the ghc-devs mailing list