They are useful for defining functions that operate over data constructors with arbitrary arity, of course!
A concrete example could be a function that, given a data constructor with arbitrary arity, returns a new data constructor that wraps the given constructor in Some().