Polimorfismo paramétrico


En los lenguajes de programación y la teoría de tipos , el polimorfismo paramétrico es una forma de hacer que un lenguaje sea más expresivo, al mismo tiempo que se mantiene la seguridad de tipos completamente estática . Usando el polimorfismo paramétrico , una función o un tipo de datos se puede escribir de forma genérica para que pueda manejar valores de forma idéntica sin depender de su tipo. [1] Estas funciones y tipos de datos se denominan funciones genéricas y tipos de datos genéricos , respectivamente, y forman la base de la programación genérica .

Por ejemplo, una función appendque une dos listas se puede construir de modo que no le importe el tipo de elementos: puede agregar listas de enteros , listas de números reales , listas de cadenas , etc. Deje que la variable de tipo a denote el tipo de elementos en las listas. Entonces appendse puede escribir

donde [a]denota el tipo de listas con elementos de tipo a . Decimos que el tipo de appendestá parametrizado por a para todos los valores de a . (Tenga en cuenta que dado que solo hay una variable de tipo, la función no se puede aplicar a cualquier par de listas: el par, así como la lista de resultados, debe consistir en el mismo tipo de elementos) Para cada lugar donde appendse aplica, un el valor se decide para un .

Siguiendo a Christopher Strachey , [2] el polimorfismo paramétrico puede contrastarse con el polimorfismo ad hoc , en el que una sola función polimórfica puede tener una serie de implementaciones distintas y potencialmente heterogéneas según el tipo de argumento(s) al que se aplica. Por lo tanto, el polimorfismo ad hoc generalmente solo puede admitir un número limitado de tales tipos distintos, ya que se debe proporcionar una implementación separada para cada tipo.

El polimorfismo paramétrico se introdujo por primera vez en los lenguajes de programación en ML en 1975. [3] Hoy existe en Standard ML , OCaml , F# , Ada , Haskell , Mercury , Visual Prolog , Scala , Julia , Python , TypeScript , C++ y otros. Java , C# , Visual Basic .NET y Delphihan introducido "genéricos" para el polimorfismo paramétrico. Algunas implementaciones de polimorfismo de tipo son superficialmente similares al polimorfismo paramétrico, aunque también introducen aspectos ad hoc. Un ejemplo es la especialización de plantillas de C++ .

La forma más general de polimorfismo es el " polimorfismo impredicativo de rango superior ". Dos restricciones populares de esta forma son el polimorfismo de rango restringido (por ejemplo, polimorfismo de rango 1 o prenexo ) y el polimorfismo predicativo. Juntas, estas restricciones dan "polimorfismo prenex predicativo", que es esencialmente la forma de polimorfismo que se encuentra en ML y versiones anteriores de Haskell.