It would be really nice if constructor tags were reified into the language and allowed pattern matching on them.

For example, given a data type with three constructors it might be nice write a function converting a value to a string like so:

data Op = Add Expr Expr | Sub Expr Expr | Mult Expr Expr

show :: Op -> String
show (constructor e1 e2) =
    let opSym = case constructor of
            | Add -> "+"
            | Sub -> "-"
            | Mult -> "*"
     in show e1 ++ opSym ++ show e2

Obviously this is more difficult to support when there are constructors with different numbers of parameters.

See also Pattern Calculus by Barry Jay for a language that implements something like this.