¿La "Restricción de valor" significa que no hay una programación funcional de orden superior?
Absolutely not! La restricción de valor apenas interfiere con la programación funcional de orden superior. Lo que no hacer es restringir algunas aplicaciones de polimórficos funciones — no funciones de orden superior — en el nivel superior.
Veamos su ejemplo. Su problema es que oops
y oops2
son ambos la función de identidad y tienen tipo forall 'a . 'a -> 'a
. En otras palabras, cada uno es un valor polimórfico. Pero el lado derecho no es un llamado "valor sintáctico"; es una aplicación de función. (Una aplicación de función no puede devolver un valor polimórfico porque si fuera así, podría construir una función hacky usando referencias mutables y listas que podrían subvertir el sistema de tipo; es decir, podría escribir una función de terminación tipo forall 'a 'b . 'a -> 'b
.
casos Afortunadamente, en casi todos los prácticos, el valor polimórfico en cuestión es una función, y se pueden definir por ETA en expansión:
let oops x = simple "" x
Este idioma parece que tiene algún costo en tiempo de ejecución, pero dependiendo de el inliner y el optimizador, que pueden ser eliminados por el compilador —, es solo el tipoche que tiene problemas.
El ejemplo oops2
es más problemático porque usted tiene que hacer y deshacer el valor constructor:
let oops2 = F(fun x -> let F f = get "" in f x)
Este es un buen pero más tedioso, pero la función anónima fun x -> ...
es un valor sintáctico y F
es una constructor de tipo de datos, y un constructor aplicado a un valor sintáctico es también un valor sintáctico, y Bob es tu tío. El embalaje y desembalaje de F
se compilará en la función de identidad, por lo que oops2
va a compilar en exactamente el mismo código de máquina que oops
.
Las cosas son aún más desagradables cuando se desea que un cálculo en tiempo de ejecución devuelva un valor polimórfico como None
o []
. Como insinuado por Nathan Sanders, puede ir en contra de la restricción de valor con una expresión tan simple como rev []
:
Standard ML of New Jersey v110.67 [built: Sun Oct 19 17:18:14 2008]
- val l = rev [];
stdIn:1.5-1.15 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val l = [] : ?.X1 list
-
Nada de orden superior no! Y sin embargo, la restricción de valor se aplica.
En la práctica la restricción de valor no presenta ninguna barrera para la definición y el uso de las funciones de orden superior; simplemente expandes eta
¿Le importaría que reformular como una pregunta que tiene sentido? –
No soy un experto en programación funcional, pero ¿no es esta restricción una característica de los lenguajes similares a ML que no comparten otros lenguajes funcionales (por ejemplo, Haskell)? Si es así, es posible que desee etiquetar su pregunta en consecuencia. –
mi pregunta es: ¿la mutabilidad significa una realidad virtual estricta en los lenguajes funcionales inferidos? – Sadache