
On Fri, 22 Feb 2019, Bryan Richter wrote:
Another pet peeve: Export constructors but only for pattern matching purposes, i.e., elimination; not for construction--we'd export smart constructors for the latter which would ensure invariants
I believe you are in luck. Since 7.8.1, GHC supports "unidirectional pattern synonyms", as described somewhere in this section: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts...
In some cases you can even solve it in Haskell 98. If you have data T = Cons Char and you want to let users match Cons without exporting it, you may export a "destructor" like uncons :: T -> Char uncons (Cons a) = a or you export a continuation passing function: withT :: (Char -> a) -> T -> a withT f (Cons a) = f a and the user would no longer write g :: Int -> T -> Ordering -> Bool g x (Cons y) z = foo x y z but g :: Int -> T -> Ordering -> Bool g x = withT $ \y z -> foo x y z