He leído en alguna parte que el polimorfismo de orden superior no se puede utilizar/implementar en los sistemas de tipos con los tipos de valor (como .NET). ¿Está bien y por qué?Polimorfismo de orden superior + tipos de valor
Respuesta
El problema es con la representación del valor
Los lenguajes tradicionales de polimorfismo de alto orden han hecho la elección simplificadora de que todos los valores se representan de manera uniforme, generalmente una sola palabra, con un etiquetado inteligente para indicar si es un entero inmediato o un puntero a una estructura con un común representación (alguna etiqueta, etc.) para todos los demás valores, como estructuras de datos o funciones.
Si usted tiene este supuesto, se puede compilar cada función polimórfica una vez, y utilizarlo en todos los argumentos de todo tipo: tienen la representación asumida por la función compilado.
Ahora diga que arroja tipos con otras representaciones, ej. varias palabras continuas en la pila. Ya no puede usar su única función compilada, ya que esperará una sola palabra, por lo que la convención de llamadas no es correcta. Algo está roto.
Esto se puede solucionar de varias maneras, tales como:
pase junto con los valores alguna información acerca de su representación (usted podría considerar esta información a ser una especie de tiempo de ejecución "tipo" de la información, pero de hecho, no necesita la información completa, solo información sobre representación); esto es lo que el compilador TILT ha explorado, por ejemplo
intenta compilar varias versiones especializadas de su función polimórfica para cada posible representación, luego decide (también basado en una especie de etiqueta, o alguna información estáticamente disponible) qué versión llamar. Esto podría ser razonable con un esquema de optimización de todo el programa como MLton's. Esta es más o menos una versión de elección de llamada (en lugar de llamada de elección) de la primera idea.
restringir polimorfismos utilizando un sistema tipo "para distinguir los tipos de una sola palabra", "tipos" de tupla. En lugar del polimorfismo habitual "para type type", tendría una versión relativizada "para todos los tipos de ese tipo ...". Esto le permite al programador razonar estáticamente sobre qué función puede aceptar qué tipo de argumentos ("ow, esta función es polimórfica, entonces debo colocar mi tipo de valor aquí") en lugar de esperar que el compilador obtenga las coerciones correctas, pero esto también hace que el sistema de tipo sea más pesado: no conserva la ilusión de uniformidad.
En resumen, combinada (alguna forma de) polimorfismo con datos ricos opciones representación es posible, pero mucho más difícil que en el caso representación uniforme.
No, esto es incorrecto. se puede lograr "más alto polimorfismo orden" (funciones que se comportan de manera uniforme sobre todos los tipos) por tener tipos de parámetros o bien ser definida como genéricos o de tipo object
(tipos de valor obtendrá automáticamente "en caja" en objetos)
- 1. Práctica común para el polimorfismo de orden superior en scala
- 2. de orden superior constructores de tipos y funtores en Ocaml
- 3. Unificación de orden superior
- 4. de orden superior ScalaCheck
- 5. C# polimorfismo en tipos genéricos
- 6. polimorfismo, genéricos y tipos anónimos C#
- 7. Tipos de mayor kinded con C++
- 8. Calling Clojure funciones de orden superior
- 9. "filtro" función de orden superior en C++
- 10. Programación de orden superior con Boost :: Python
- 11. funciones de orden superior en C
- 12. Funciones de orden superior en Clojure
- 13. Polimorfismo de devolución para el valor por transferencia
- 14. clasificados Superior y impredicativas tipos
- 15. ¿La "Restricción de valor" significa prácticamente que no hay una programación funcional de orden superior?
- 16. JSON polimorfismo
- 17. Elevación de una función de orden superior en Haskell
- 18. ¿Es lambda un tipo de función de orden superior?
- 19. Genéricos Java - implementando funciones de orden superior como map
- 20. Valor y tipos de referencia
- 21. Delegados contravariantes Tipos de valor
- 22. Pregunta de diseño: Polimorfismo en javascript
- 23. Linq - el valor superior de cada grupo
- 24. método de sobrecarga y polimorfismo
- 25. ¿Cómo puedo probar una función de orden superior con QuickCheck?
- 26. Llamar a un orden superior F # función de C#
- 27. ¿Alguna idea sobre construir un programa Quine de orden superior?
- 28. Cómo utilizar Math.max, etc., como funciones de orden superior
- 29. ¿Caso de uso para el polimorfismo de rango 3 (o superior)?
- 30. ¿Qué usos ha encontrado para los tipos de rango superior en Haskell?
Los tipos de valor con recursión polimórfica son problemáticos para la solución n. ° 2 porque es posible que deba compilar infinitamente muchas versiones del código. Es posible detectar tales casos? – Jules
En la práctica, no querrás llenar tu pila con tipos de valores que crecerán sin límites debido a las llamadas recursivas de todos modos.Mi intuición sería que poner un límite estático en el tamaño (y en el cuadro anterior) o forzar recurrencias tipo para pasar al menos un puntero son soluciones más razonables en la mayoría de los casos que agregar un JIT completo a su idioma para manejar esto. – gasche