stringtranslate.com

Cuantificación acotada

En teoría de tipos , la cuantificación limitada (también polimorfismo limitado o genericidad restringida ) se refiere a cuantificadores universales o existenciales que están restringidos ("limitados") para abarcar solo los subtipos de un tipo particular. La cuantificación limitada es una interacción del polimorfismo paramétrico con la subtipificación . La cuantificación acotada se ha estudiado tradicionalmente en el entorno funcional de System 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 algún comportamiento específico de los objetos en lugar de la herencia de tipos . Asume un modelo basado en registros para clases de objetos, donde cada miembro de la clase es un elemento de registro y todos los miembros de la clase son funciones nombradas. Los atributos de los objetos se representan como funciones que no toman argumentos y devuelven un objeto. El comportamiento específico es entonces el nombre de alguna función junto con los tipos de 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 comparables entre sí. [ cita necesaria ]

Cuantificación limitada por F

La cuantificación limitada por F o cuantificación limitada recursivamente , introducida en 1989, permite una tipificación más precisa de funciones que se aplican en tipos recursivos. Un tipo recursivo es aquel que incluye una función que lo utiliza como tipo para algún argumento o su valor de retorno. [1]

Ejemplo

Este tipo de restricción de tipo se puede expresar en Java con una interfaz genérica. El siguiente ejemplo demuestra cómo describir tipos que se pueden comparar entre sí y utilizarlos como información de escritura en funciones polimórficas . La Test.minfunción utiliza una cuantificación limitada simple y no garantiza que los objetos sean mutuamente comparables, a diferencia de la Test.fMinfunción que utiliza una cuantificación limitada por F.

En notación matemática, los tipos de las dos funciones son

min: ∀ T, ∀ S ⊆ {comparar con: T → int}. S → S → S
fMín: ∀ T ⊆ Comparable[T]. T → T → T

dónde

Comparable[T] = {comparar con: T → int}
interfaz  Comparable < T > {  int comparar con ( T otro );  }clase pública Entero implementa Comparable <Entero> {      @Override public int compareTo ( Entero otro ) { // ... } }       clase pública String implementa Comparable < String > {      @Override public int compareTo ( String other ) { // ... }       }prueba de clase pública { pública estática vacía principal ( cadena [] args ) { cadena final a = min ( "gato" , "perro" ); Entero final b = min ( 10 , 3 ); final Comparable c = min ( "gato" , 3 ); // Lanza ClassCastException en tiempo de ejecución final String str = fMin ( "gato" , "perro" ); Entero final i = fMin ( 10 , 3 ); // Objeto final o = fMin("gato", 3); // No compila } public static < S extends Comparable > S min ( S a , S b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } más { return b ; } } public static < T extiende Comparable < T >> T fMin ( T a , T b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } más { return b ; } }                                                                                               }

Ver también

Notas

  1. ^ Polimorfismo limitado por F para programación orientada a objetos. Canning, Cook , Hill, Olthof y Mitchell . http://dl.acm.org/citation.cfm?id=99392

Referencias

enlaces externos