En teoría de tipos , la cuantificación acotada (también conocida como polimorfismo acotado o genericidad restringida ) se refiere a cuantificadores universales o existenciales que están restringidos ("acotados") para abarcar únicamente los subtipos de un tipo particular. La cuantificación acotada es una interacción del polimorfismo paramétrico con la subtipificación . Tradicionalmente, la cuantificación acotada se ha estudiado en el contexto funcional del Sistema F <:, pero está disponible en lenguajes modernos orientados a objetos que admiten polimorfismo paramétrico ( genéricos ), como Java , C# y Scala .
Descripción general
El propósito de la cuantificación acotada es permitir que las funciones polimórficas dependan de un comportamiento específico de los objetos en lugar de la herencia de tipos . Presupone un modelo basado en registros para las clases de objetos, donde cada miembro de la clase es un elemento de registro y todos los miembros de la clase son funciones con nombre. Los atributos de los objetos se representan como funciones que no reciben argumentos y devuelven un objeto. El comportamiento específico es entonces un nombre de función junto con los tipos de los argumentos y el tipo de retorno. La cuantificación acotada considera todos los objetos con dicha función. Un ejemplo sería una minfunción polimórfica que considera todos los objetos que son comparables entre sí.
cuantificación acotada por F
La cuantificación acotada por F o cuantificación recursivamente acotada , introducida en 1989, permite una tipificación más precisa de las funciones que se aplican a tipos recursivos. Un tipo recursivo es aquel que presenta como constructor una función que lo utiliza como tipo para algún argumento, o el valor de retorno de un argumento funcional, o algún argumento del valor de retorno funcional de un argumento funcional, etc.: es decir, en posición positiva. [ 1 ]
Ejemplo
Este tipo de restricción de tipo se puede expresar en Java con una interfaz genérica. El siguiente ejemplo muestra cómo describir tipos que se pueden comparar entre sí y cómo usar esta información de tipado en funciones polimórficas . La Test::minfunción utiliza cuantificación acotada simple y no garantiza que los objetos sean comparables entre sí, a diferencia de la Test::fMinfunción que utiliza cuantificación acotada F.
En notación matemática, los tipos de las dos funciones son:
dónde
Considere las siguientes posibles declaraciones en java.lang:
paquete java.lang ;interfaz pública Comparable < T > { int compareTo ( T other ); }public class Integer implements Comparable < Integer > { @Override public int compareTo ( Integer other ) { // ... } }public class String implements Comparable < String > { @Override public int compareTo ( String other ) { // ... } }Luego, en uso:
paquete org.wikipedia.examples ;public class Test { public static < S extends Comparable > S min ( S a , S b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } else { return b ; } }public static < T extends Comparable < T >> T fMin ( T a , T b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } else { return b ; } }public static void main ( String [] args ) { String a = min ( "cat" , "dog" ); Integer b = min ( 10 , 3 ); Comparable c = min ( "cat" , 3 ); // Lanza ClassCastException en tiempo de ejecución String str = fMin ( "cat" , "dog" ); Integer i = fMin ( 10 , 3 ); // Object o = fMin("cat", 3); // No compila } }Véase también
Notas
Referencias
- Cardelli, Luca ; Wegner, Peter (diciembre de 1985). "Sobre la comprensión de los tipos, la abstracción de datos y el polimorfismo" (PDF) . ACM Computing Surveys . 17 (4): 471– 523. CiteSeerX 10.1.1.117.695 . doi : 10.1145/6041.6042 . ISSN 0360-0300 . S2CID 2921816 .
- Peter S. Canning , William R. Cook , Walter L. Hill , John C. Mitchell y William Olthoff . «Polimorfismo con límite F para la programación orientada a objetos» . En Conferencia sobre lenguajes de programación funcional y arquitectura de computadoras , 1989.
- Benjamin C. Pierce, "Tipos de intersección y polimorfismo acotado". Lecture Notes in Computer Science 664 , 1993.
- Gilad Bracha , Martin Odersky , David Stoutamire y Philip Wadler . «Garantizando la seguridad del pasado en el futuro: Añadiendo genericidad al lenguaje de programación Java». En Programación Orientada a Objetos: Sistemas, Lenguajes y Aplicaciones (OOPSLA). ACM, octubre de 1998.
- Andrew Kennedy y Don Syme . "Diseño e implementación de genéricos para el Common Language Runtime de .NET". En Diseño e implementación de lenguajes de programación , 2001.
- Pierce, Benjamin C. (2002). Tipos y lenguajes de programación . MIT Press. ISBN 978-0-262-16209-8.Capítulo 26: Cuantificación acotada
Enlaces externos
- Polimorfismo acotado en el repositorio de patrones de Portland
- "Polimorfismo acotado por F" en el lenguaje Cecil: especificación y fundamentos
- Polimorfismo (informática)
- Programación orientada a objetos
- teoría de tipos