'tipo de familia' vs 'familia de datos', en breve?

Estoy confundido acerca de cómo elegir entredata family ytype family. La página wiki enTipoFamilias entra en muchos detalles De vez en cuando se refiere informalmente a Haskelldata family como una "familia tipo" en prosa, pero por supuesto también haytype family en Haskell.

Hay un ejemplo simple que muestra dónde se muestran dos versiones de código, diferenciándose solo en si undata family o untype family está siendo 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 ydata Aquí tienen el mismo significado, pero eltype family la versión no puede verificar el tipo, mientras quedata family La versión está bien, porquedata family "crea nuevos tipos y por lo tanto son inyectivos" (dice la página wiki).

Mi conclusión de todo esto es "tratardata family para casos simples y, si no es lo suficientemente potente, intentetype family". Lo cual está bien, pero me gustaría entenderlo mejor. ¿Hay un diagrama de Venn o un árbol de decisiones que pueda seguir para distinguir cuándo usar cuál?

Respuestas a la pregunta(2)

Su respuesta a la pregunta