Proposal: pattern synonyms
Conor McBride
ctm at cs.nott.ac.uk
Thu Feb 16 04:51:10 EST 2006
Hi folks
Having spent the last week hacking, I've found a common irritation, so I
have a proposal to mitigate it. Of course, this issue may not bug anyone
else, so I'm a little hesitant. In pessimal pedagogical order, the
proposal: pattern synonyms. I want to be allowed to write stuff like
P x y z = C x (y, [z])
defining a capitalised symbol with parameters used linearly in a pattern
on the right-hand side. Pattern synonyms should be fully applied and
expand macro-style wherever patterns or terms appear, hence should not
give rise to cycles, just like type synonyms.
It seems (and is) trivial. Why would it help? Well, it would help me,
because I often write more complex types than strictly necessary to
represent data in order to expose its structure and thus gain free
equipment. For example, taking
newtype Comp f g x = Comp (f (g x)) -- applicative if f and g are
newtype Prod f g x = Prod (f x, g x) -- applicative if f and g are
newtype Const x y = Const y -- applicative if x is a monoid
newtype Id x = Id x -- trivially applicative
newtype Any = Any Bool -- equipped with the disjunctive monoid structure
all of which I keep lying around anyway,
I might well write
type MyEffect = Comp Maybe (Prod (Const Any) Id)
which is the same as
type MyEffect' x = Maybe (Bool, x)
except that
(1) MyEffect :: * -> * is an applicative functor without further ado
(because it is composed from suitable components), hence I get lots of
free kit for traversing data with it. (If you're interested, we use this
to update terms where some variables have been changed and others have
been deleted entirely: we want to know the new term if it exists, and
whether it differs from the old one.) MyEffect' is meaningless.
(2) Pattern matching on MyEffect x is much more annoying than on
MyEffect' x.
I want to write
Bang :: MyEffect x
Bang = Comp Nothing
Bing :: x -> MyEffect x
Bing x = Comp (Just (Prod (Any True), Id x))
Dull :: x -> MyEffect x
Dull x = Comp (Just (Prod (Any False), Id x))
and have done with it.
Does this happen to anyone else? Would pattern synonyms help?
Thought I'd ask, anyway.
All the best
Conor
More information about the Haskell-prime
mailing list