To your other, more general question, "the uses of data families as distinct from type families and GADTs". Here's the space of possibilities:
- Is the type constructor generative and injective, and can it be partially applied?
- Is there a runtime tag passed along with the value to pattern match on?
- Can it be closed, can it be open? And here's where GADTs and type/data families lie in this space: