«семейство типов» против «семейства данных», вкратце?
Я не знаю, как выбирать междуdata family
а такжеtype family
, Вики-страница наTypeFamilies уходит во многие детали. Иногда это неофициально относится к Хаскеллуdata family
как "тип семьи" в прозе, но, конечно, есть и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
«создает новые типы и поэтому является инъективным» (говорит вики-страница).
Мой вынос из всего этого "попробоватьdata family
для простых случаев, и, если он недостаточно мощный, то попробуйтеtype family
". Это хорошо, но я хотел бы понять это лучше. Есть ли диаграмма Венна или дерево решений, которым я могу следовать, чтобы различать, когда использовать какой?