Familia de tipos


En informática , una familia de tipos asocia tipos de datos con otros tipos de datos , utilizando una función de nivel de tipo definida por una colección abierta de instancias válidas de tipos de entrada y los tipos de salida correspondientes. [1]

Las familias de tipos son una característica de algunos sistemas de tipos que permiten definir funciones parciales entre tipos mediante la coincidencia de patrones . Esto contrasta con los constructores de tipos de datos , que definen funciones inyectivas de todos los tipos de un tipo particular a un nuevo conjunto de tipos, y sinónimos de tipos (también conocidos como typedef ), que definen funciones de todos los tipos de un tipo particular a otro conjunto existente de tipos usando un solo caso.

Las familias de tipos y las clases de tipos están estrechamente relacionadas: las clases de tipos normales definen funciones parciales de tipos a una colección de valores con nombre mediante la coincidencia de patrones en los tipos de entrada, mientras que las familias de tipos definen funciones parciales de tipos a tipos mediante la coincidencia de patrones en los tipos de entrada. De hecho, en muchos usos de las familias de tipos existe una única clase de tipos que contiene lógicamente tanto valores como tipos asociados con cada instancia. Una familia de tipos declarada dentro de una clase de tipos se denomina tipo asociado . [2]

Los lenguajes de programación con soporte para familias tipográficas o características similares incluyen Haskell (con una extensión de lenguaje común), [3] Standard ML (a través de su sistema de módulos), [4] Scala (bajo el nombre "tipos abstractos"), [5] y C ++ (mediante el uso de typedefs en plantillas). [6]

La TypeFamiliesextensión en el Haskell Compiler Glasgow soporta tanto de tipo sinónimo familias y familias de datos . Las familias de sinónimos de tipo son la forma más flexible (pero más difícil de verificar), lo que permite que los tipos en el codominio de la función de tipo sean cualquier tipo con el tipo apropiado . [6] Las familias de datos, por otro lado, restringen el codominio al requerir que cada instancia defina un nuevo constructor de tipos para el resultado de la función. Esto asegura que la función sea inyectiva , permitiendo que los contextos de los clientes deconstruyan la familia de tipos y obtengan el tipo de argumento original. [1]

Las familias de tipos son útiles para abstraer patrones en los que se repite una "organización" o "estructura" común de tipos, pero con diferentes tipos específicos en cada caso. Los casos de uso típicos incluyen la descripción de tipos de datos abstractos como colecciones genéricas o patrones de diseño como modelo-vista-controlador .