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

Я не знаю, как выбрать между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)

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