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