This assumes that you have an isA and an isB function. This forces me to write such a function which I might not have and in case of very very very large data types (like ~20-30, if not more, constructors) it becomes unwieldy and very messy.
It's probably less work than duplicating the cases, and ideally you can give a more meaningful name to the whole "isA or isB" construct - especially when you have a lot of constructors!
If he's not binding anything, he could just match C{} in the first rule and a wildcard (_) in the second.
Yes, but there could be a D{}, now or in the future.
I rarely use wildcards that aren't embedded in the middle of some larger structure. They stop the compiler from telling me points I need to consider, as I change my code.
If you're not binding anything, you could do it with guards: