'família de tipos' vs 'família de dados', em resumo?
Estou confuso sobre como escolher entredata family
etype family
. A página wiki emTipoFamílias entra em muitos detalhes. Ocasionalmente, refere-se informalmente aodata family
como uma "família de tipo" em prosa, mas é claro que também hátype family
em Haskell.
Há um exemplo simples que mostra onde duas versões do código são mostradas, diferindo apenas se umadata family
ou umtype family
está sendo declarado:
-- 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
edata
aqui têm o mesmo significado, mas otype family
versão falhar na verificação de tipo, enquanto odata family
versão está bem, porquedata family
"cria novos tipos e é, portanto, injetável" (diz a página da wiki).
Meu argumento de tudo isso é "tentardata family
para casos simples e, se não for suficientemente poderoso, tentetype family
". O que é legal, mas eu gostaria de entender melhor. Existe um diagrama de Venn ou uma árvore de decisão que eu possa seguir para distinguir quando usar qual?