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:
GADTS: (1) yes, (2) yes, (3) closed Data families: (1) yes, (2) no, (3) open Type families: (1) no, (2) no, (3) open or closed