Define Haskell type constructor equality?

algebraic-data-types, haskell, pattern-synonyms

Solution

What you're asking for is called a "pattern synonym", and has been proposed multiple times. It is currently not implemented. You can view the proposals here, here, and a bunch of other places (links courtesy of hammar).

However, as a solution, this works just as well:

foo (MU Terran Zerg) = ...
foo (MU Zerg Terran) = foo $ MU Terran Zerg

and will effectively achieve the same thing, even if it doesn't look as nice.

Problem

I'm not meaning as a member of Eq. My code: ``` data Race = Terran | Zerg | Protoss deriving (Eq, Show, Read); data MU = MU Race Race deriving (Eq, Show); ``` In this case I define for instance `(MU Terran Zerg)`. I want to create a data constructor `TvZ` which is essentially identical in all aspects for intance so I can match a function pattern: ``` foo TvZ = ... ``` instead of having to do ``` foo (MU Terran Zerg) = ... ``` Which you can't do if you assign it to a variable as in `tvZ = (MU Terran Zerg)` Another thing I want to do is making short forms as in making the type constructor `T` and `Terran` identical. Last thing, medivac speed boost needs a minor nerf I feel.

Original source