'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?