En la informática , la recursión polimórfico (también referido como Milner - Mycroft typability o el cálculo Milner-Mycroft ) se refiere a un recursiva paramétricamente polimórfica función donde hicieron los cambios de parámetros de tipo con cada invocación recursiva, en vez de permanecer constante. La inferencia de tipo para la recursividad polimórfica es equivalente a la semi-unificación y, por lo tanto, indecidible y requiere el uso de un semi-algoritmo o anotaciones de tipo suministradas por el programador . [1]
Considere el siguiente tipo de datos anidado :
datos anidados a = a : <: ( anidados [ a ]) | Epsilon infixr 5 : <:anidado = 1 : <: [ 2 , 3 , 4 ] : <: [[ 5 , 6 ], [ 7 ], [ 8 , 9 ]] : <: Epsilon
Una función de longitud definida sobre este tipo de datos será polimórficamente recursiva, ya que el tipo de argumento cambia de Nested a
a Nested [a]
en la llamada recursiva:
longitud :: Anidado a -> Longitud int Epsilon = 0 longitud ( _ : <: xs ) = 1 + longitud xs
Tenga en cuenta que Haskell normalmente infiere la firma de tipo para una función de apariencia tan simple como esta, pero aquí no se puede omitir sin desencadenar un error de tipo.
Esta sección necesita expansión . Puedes ayudar agregando más . ( Mayo de 2012 ) |
En el análisis de programas basado en tipos, la recursividad polimórfica es a menudo esencial para obtener una alta precisión del análisis. Ejemplos notables de sistemas que emplean la recursividad polimórfica incluyen el análisis de tiempo de unión de Dussart, Henglein y Mossin [2] y el sistema de gestión de memoria basado en la región de Tofte-Talpin . [3] Como estos sistemas asumen que las expresiones ya se han escrito en un sistema de tipos subyacente (no es necesario que emplee la recursividad polimórfica), la inferencia se puede volver a hacer decidible.
Las estructuras de datos de programación funcional a menudo utilizan la recursividad polimórfica para simplificar las comprobaciones de errores de tipo y resolver problemas con desagradables soluciones temporales "intermedias" que devoran memoria en estructuras de datos más tradicionales, como árboles. En las dos citas que siguen, Okasaki (págs. 144-146) da un ejemplo de CONS en Haskell en el que el sistema de tipos polimórficos señala automáticamente los errores del programador. [4] El aspecto recursivo es que la definición de tipo asegura que el constructor más externo tiene un solo elemento, el segundo un par, el tercero un par de pares, etc. de forma recursiva, estableciendo un patrón de búsqueda automática de errores en el tipo de datos. Roberts (p. 171) da un ejemplo relacionado en Java , usando una clasepara representar un marco de pila. El ejemplo dado es una solución al problema de la Torre de Hanoi en el que una pila simula la recursividad polimórfica con una estructura de sustitución de pila anidada inicial, temporal y final. [5]