«семейство типов» против «семейства данных», вкратце?

Я не знаю, как выбирать между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". Это хорошо, но я хотел бы понять это лучше. Есть ли диаграмма Венна или дерево решений, которым я могу следовать, чтобы различать, когда использовать какой?

Ответы на вопрос(2)

Ваш ответ на вопрос