Я смущен тем, как выбирать между data family и type family. Страница wiki на TypeFamilies подробно освещена. Иногда он неофициально ссылается на Haskell data family как на "семейство типов" в прозе, но, конечно, в Haskell также есть type family.
Существует простой пример, показывающий, где показаны две версии кода, отличающиеся только тем, объявляется ли data family или type family:
-- BAD: f is too ambiguous, due to non-injectivity
-- type family F a
-- OK
data family F a
f :: F a -> F a
f = undefined
g :: F Int -> F Int
g x = f x
type и data здесь имеют одинаковое значение, но версия type family не может проверять тип, а версия data family в порядке, потому что data family "создает новые типы и поэтому является инъективной" (говорит на странице wiki).
Мой взнос от всего этого - "попробуйте data family для простых случаев, и, если он недостаточно мощный, попробуйте type family". Это хорошо, но я хотел бы лучше понять это. Есть ли диаграмма Венна или дерево решений, которое я могу отслеживать, чтобы отличить, когда использовать?