Rewrapping with simple bidirectional pattern synonyms

David Feuer david.feuer at
Wed Aug 24 22:11:16 UTC 2016

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?

More information about the ghc-devs mailing list