En la teoría de tipos de lenguajes de programación , el polimorfismo de filas es un tipo de polimorfismo que permite escribir programas que son estructuralmente [ 1 ] (en lugar de nominalmente) polimórficos en tipos de registros y/o variantes . [ 2 ]
Historia y teoría
Mitchell Wand introdujo un sistema de tipos polimórfico por filas y una prueba de inferencia de tipos para registros . [ 3 ] [ 4 ]
El tratamiento teórico del polimorfismo de filas se complica un tanto por la necesidad de tener etiquetas distintas en un registro. Un enfoque, adoptado por Rémy y sus colegas (e implícitamente presente en la presentación que sigue, la cual está fuertemente inspirada en la de Wand), consiste en considerar diferentes tipos de filas, dependiendo de sus etiquetas. [ 2 ]
Gaster y Jones extendieron formalmente el enfoque también a las variantes, haciendo que tanto el constructor de tipo de registro como el de tipo de variante mapeen de tipos de fila a tipos. [ 5 ]
Blume et al. propusieron llevar el enfoque un paso más allá en el ámbito de las extensiones componibles agregando "casos de primera clase" manejados por una LetCCconstrucción para componer continuaciones en el código de coincidencia de casos. [ 6 ] Luego, un par de proyectos (Links , Koka) han utilizado el polimorfismo de filas como base de tipos de un sistema de efectos algebraicos , apuntando a la "composición libre" de efectos definidos por el usuario. [ 7 ] [ 8 ]
Otro enfoque para el problema de las etiquetas únicas es extender el sistema F con un operador de "fusión coherente", lo que da como resultado cálculos con los llamados tipos de intersección disjuntos . [ 9 ]
Morris y McKinna generalizaron los tipos de filas a teorías de filas para manejar uniformemente nociones variables de extensión (de registros) en un único marco teórico: por ejemplo, una aplicación puede desear que la operación de extensión sobrescriba los campos existentes en caso de nombres coincidentes, otra puede querer mantener ambos accesibles, posiblemente algún esquema de direccionamiento basado en rutas, etc. [ 10 ]
Definición de tipo de registro polimórfico por filas
El tipo de registro polimórfico por filas define una lista de campos con sus tipos correspondientes, una lista de campos faltantes y una variable que indica la ausencia o presencia de campos adicionales arbitrarios. Ambas listas son opcionales y la variable puede estar restringida. Específicamente, la variable puede estar "vacía", lo que indica que no puede haber campos adicionales para el registro.
Puede escribirse como. Esto indica un tipo de registro que tiene camposcon sus respectivos tipos de(para), y no tiene ninguno de los campos(para), mientrasexpresa el hecho de que el registro puede contener otros campos que.
Los tipos de registro polimórficos por filas nos permiten escribir programas que operan solo en una sección de un registro. Por ejemplo, se puede definir una función que realice una transformación bidimensional que acepte un registro con dos o más coordenadas y devuelva un tipo idéntico:
Gracias al polimorfismo de filas, la función puede realizar una transformación bidimensional en un punto tridimensional (de hecho, n- dimensional), dejando intacta la coordenada z (o cualquier otra coordenada). En un sentido más general, la función puede realizarse en cualquier registro que contenga los campos x e y con tipoNo hay pérdida de información: el tipo garantiza que todos los campos representados por la variableestán presentes en el tipo de retorno. En contraste, la definición de tipoexpresa que un registro de ese tipo tiene exactamente los campos x e y y nada más. En este caso, se obtiene un tipo de registro clásico.
Operaciones de mecanografía en registros
Las operaciones de registro de selección de un campo, agregando un campo :=e]} , y eliminando un campoSe les pueden asignar tipos polimórficos por filas.
:=e]\;:\;\{\mathrm {ausente} (\ell ),\rho \}\rightarrow T\rightarrow \{\ell :T,\rho \}}
Implementaciones
El polimorfismo de filas no es compatible con Standard ML , pero sí lo es con algunas extensiones o derivados como SML# [ 11 ] y Ocaml .
La existencia misma de la primera versión de SML# fue motivada [ 12 ] por la adición de polimorfismo de filas, basado en un artículo de SIGMOD '89 de Ohori et al., [ 13 ] que introdujo la extensión "Machiavelli" a SML, aunque su nombre fue cambiado posteriormente a "SML# de Kansai", antes de adoptar el nombre más corto. El '#' en el nombre no tiene relación con F# , sino que se debe al #operador utilizado para definir implícitamente los tipos polimórficos de filas en el acceso a campos.
En OCaml, el polimorfismo de filas es utilizado por objectlos tipos de OCaml y también por sus variantes polimórficas. Los tipos de registro ordinarios no son polimórficos de filas en OCaml. [ 14 ] Castagna et al. han criticado a OCaml por carecer de tipado sensible al flujo , lo cual es particularmente notorio en la inferencia de tipos para variantes polimórficas. También señalan que, dado que OCaml carece de tipos de unión verdaderos y sin etiquetar , algunos de los tipos inferidos para variantes polimórficas son demasiado restrictivos, en particular cuando se utilizan tipos de producto en combinación con variantes polimórficas. [ 15 ]
F# puede simular el polimorfismo de filas utilizando su mecanismo de "Parámetros de tipo resueltos estáticamente" (SRTP), [ 16 ] que también se ha denominado informalmente " tipado pato estático ". [ 17 ] Sin embargo, esto se limita a las funciones F# en línea, por lo que no se exportan al sistema de tipos .NET , que a su vez no admite dicha característica.
PureScript también admite el polimorfismo de filas . [ 18 ]
Notas
- ↑ https://www.cs.cmu.edu/~aldrich/courses/819/slides/rows.pdf , pág. 12
- 1 2 François Pottier y Didier Rémy, "The Essence of ML Type Inference", capítulo 10 en Advanced Topics in Types and Programming Languages, editado por Benjamin C. Pierce, MIT Press, 2005, páginas 389-489. En particular, véase la página 466, donde se analizan los tipos de registro, y la página 483, donde se analizan las variantes polimórficas.
- ↑ Wand, Mitchell (junio de 1989). "Inferencia de tipos para concatenación de registros y herencia múltiple". Actas del Cuarto Simposio Anual sobre Lógica en Ciencias de la Computación . págs. 92–97 . doi : 10.1109/LICS.1989.39162 .
- ↑ Wand, Mitchell (1991). "Inferencia de tipos para concatenación de registros y herencia múltiple". Information and Computation . 93 (Selecciones del Simposio IEEE de 1989 sobre lógica en ciencias de la computación): 1–15 . doi : 10.1016/0890-5401(91)90050-C . ISSN 0890-5401 .
- ↑ Benedict R. Gaster y Mark P. Jones, Un sistema de tipos polimórfico para registros y variantes extensibles, Informe técnico NOTTCS-TR-96-3, noviembre de 1996
- ↑ Matthias Blume, Umut A. Acar, Wonseok Chae, Programación extensible con casos de primera clase, ICFP '06
- ↑ D. Leijen. Koka: Programación con tipos de efectos polimórficos por filas. En P. Levy y N. Krishnaswami, editores, Actas del 5.º Taller sobre Programación Funcional Estructurada Matemáticamente, MSFP, Grenoble, Francia, abril de 2014, volumen 153 de EPTCS, páginas 100-126, 2014.
- ↑ Daniel Hillerström y Sam Lindley. “Efectos liberadores con filas y manejadores”. TyDe 2016. Nara, Japón. 2016. doi:10.1145/2976022.2976033.
- ↑ Ningning Xie, Bruno C. d. S. Oliveira, Xuan Bi, Tom Schrijvers, Polimorfismo de filas y acotado mediante polimorfismo disjunto, ECOOP 2020
- ↑ J. Garrett Morris, James McKinna, "Abstrayendo tipos de datos extensibles: o, filas con cualquier otro nombre", POPL 2019
- ↑ "8 Característica SML#: Polimorfismo de registros ‣ Parte II Tutoriales ‣ Documento SML# Versión 4.0.0 - Proyecto SML#" .
- ↑ "Una breve historia de SML# - Proyecto SML#" .
- ↑ Ohori, Atsushi; Buneman, Peter; Breazu-Tannen, Val (1989). "Programación de bases de datos en Maquiavelo: un lenguaje polimórfico con inferencia de tipos estática" . Actas de la conferencia internacional ACM SIGMOD de 1989 sobre gestión de datos - SIGMOD '89 . págs. 46-57 . doi : 10.1145/67544.66931 . ISBN 0-89791-317-5.
- ↑ https://www.cl.cam.ac.uk/teaching/1415/L28/rows.pdf , pág. 8
- ↑ Giuseppe Castagna, Tommaso Petrucciani, Kim Nguyễn, "Tipos de teoría de conjuntos para variantes polimórficas", ICFP 2016
- ↑ "¿Polimorfismo qué?" . 8 de diciembre de 2017.
- ↑ "Tipado estático en F# | Informática compositiva" .
- ↑ "Coincidencia de patrones - PureScript mediante ejemplos" .
- Polimorfismo (informática)