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