Pattern synonyms provide a shorthand way to express a value; also they can provide an abstract name to avoid a client module breaking into the data decl. Here's a not very useful one, as an example for discussion:
data MyNum = MkNum Int
pattern Zero :: MyNum
pattern Zero = MkNum 0
What I can do to help data capture is provide a Read instance for MyNum. How do I get a Read instance for Zero? (Zero is a pseudo-data constructor, not a type constructor, so that question is making a category error.)
All I can think of is to avoid deriving (Read, ...) for MyNum and then hand-craft
instance Read MyNum where
... parse "MkNum ..."
... parse "Zero"
For parsing, Zero should be just another constructor for MyNum. It could be derived -- or could it?
I don't think any of the advanced deriving mechanisms would help here. Because the type is MyNum and the only associated constructor ie MkNum.
I could provide a function readZero :: String -> MyNum. But I can't overload read, therefore I can't embed Zero inside a long String literal that I'm reading to make a data structure.
Any ideas?