Pregunta

Los términos parecen ser definido de manera diferente, pero siempre he pensado en uno que implica al otro; No puedo pensar en ningún caso cuando una expresión es referencialmente transparente pero no pura, o viceversa.

Wikipedia mantiene artículos separados para estos conceptos y dice:

De Transparencia referencial:

Si todas las funciones involucradas en la expresión son funciones puras, entonces la expresión es referencialmente transparente. Además, algunas funciones impuras se pueden incluir en la expresión si sus valores se descartan y sus efectos secundarios son insignificantes.

De Expresiones puras:

Se requieren funciones puras para construir expresiones puras. [...] Las expresiones puras a menudo se denominan referencialmente transparentes.

Encuentro estas declaraciones confusas. Si los efectos secundarios de una llamada "función impura" son insignificante suficiente para permitir no realizarlos (es decir, reemplazar una llamada a tal función con su valor) Sin cambiar materialmente el programa, es lo mismo que si fuera puro en primer lugar, ¿no?

¿Existe una forma más simple de comprender las diferencias entre una expresión pura y una transparente referencial, si es que hay alguna? Si hay una diferencia, una expresión de ejemplo que demuestra claramente que sería apreciada.

¿Fue útil?

Solución

Si dedico a un lugar tres teóricos de mi conocido, al menos dos de ellos no están de acuerdo con el significado del término "transparencia referencial". Y cuando era un joven estudiante, un mentor mío me dio un artículo explicando que incluso si considera solo la literatura profesional, la frase "referencialmente transparente" se usa para significar al menos tres cosas diferentes. (Desafortunadamente, ese documento está en algún lugar en una caja de reimpresiones que aún no se han escaneado. Busqué en Google Scholar pero no tuve éxito).

No puedo informarte, pero yo pueden aconsejarle que se rinda: porque incluso el pequeño cuadro de teóricos del lenguaje de cabeza puntual no puede estar de acuerdo en lo que significa, el término "referencialmente transparente" es Inútil. Así que no lo uses.


PD: sobre cualquier tema que tenga que ver con la semántica de los lenguajes de programación, Wikipedia no es confiable. He dejado de tratar de arreglarlo; El proceso wikipediano parece considerar el cambio y la votación popular sobre la estabilidad y la precisión.

Otros consejos

Todas las funciones puras son necesariamente referencialmente transparentes. Dado que, por definición, no pueden acceder a nada más que lo que se pasan, su resultado debe estar completamente determinado por sus argumentos.

Sin embargo, es posible tener funciones referencialmente transparentes que no son puras. Puedo escribir una función que se le da un int i, luego genera un número aleatorio r, resta r de sí mismo y lo coloca en s, luego regresa i - s. Claramente, esta función es impura, porque está generando números aleatorios. Sin embargo, es referencialmente transparente. En este caso, el ejemplo es tonto e artificial. Sin embargo, en, por ejemplo, Haskell, el id la función es de tipo a - > a mientras que mi stupidId la función sería de tipo a -> IO a indicando que hace uso de efectos secundarios. Cuando un programador puede garantizar a través de una prueba externa de que su función es realmente transparente, entonces puede usar unsafePerformIO para desnudar el IO alejado del tipo.

Estoy algo inseguro de la respuesta que doy aquí, pero seguramente alguien nos señalará en alguna dirección. :-)

La "pureza" generalmente se considera que significa "falta de efectos secundarios". Se dice que una expresión es pura si su evaluación carece de efectos secundarios. ¿Qué es un efecto secundario entonces? En un lenguaje puramente funcional, el efecto secundario es cualquier cosa que no pase por la regla beta simple (la regla que evaluar la aplicación de la función es la misma que sustituir el parámetro real por todas las ocurrencias libres del parámetro formal).

Por ejemplo, en un lenguaje funcional con lineal (o singularidad, esta distinción no debería molestar en este momento) se permite la mutación (controlada).

Así que supongo que hemos resuelto qué "pureza" y "efectos secundarios" podrían ser.

La transparencia referencial (de acuerdo con el artículo de Wikipedia que citó) significa que la variable puede ser reemplazada por la expresión que denota (abrevias, representa) sin cambiar el significado del programa en cuestión (por cierto, esta también es una pregunta difícil de abordar, y No intentaré hacerlo aquí). Entonces, la "pureza" y la "transparencia referencial" son cosas diferentes: "la pureza" es una propiedad de alguna expresión significa aproximadamente "no produce efectos secundarios cuando se ejecuta" mientras que la "transparencia referencial" es una propiedad que relaciona la variable y la expresión que significa y significa que "la variable se puede reemplazar con lo que denota".

Ojalá esto ayude.

Estas diapositivas de una charla de Accu2015 Tener un gran resumen sobre el tema de la transparencia referencial.

De una de las diapositivas:

Un lenguaje es referencialmente transparente si (a) cada subexpresión puede ser reemplazado por cualquier otro que sea igual a él en valor y (b) todas las ocurrencias de una expresión dentro de un contexto dado producen el mismo valor.

Puede tener, por ejemplo, una función que registra su cálculo en la salida estándar del programa (por lo tanto, no será una función pura), pero puede reemplazar las llamadas para esta función por una función similar que no registra su cálculo. . Por lo tanto, esta función tiene el transparencia referencial propiedad. Pero ... la definición anterior es sobre idiomas, no expresiones, como enfatizan las diapositivas.

...] Es lo mismo que si fuera puro en primer lugar, ¿no?

De las definiciones que tenemos, no, no lo es.

¿Existe una forma más simple de comprender las diferencias entre una expresión pura y una transparente referencial, si es que hay alguna?

Probar Las diapositivas que mencioné anteriormente.

Citaré lo que John Mitchell escribió en su libro Concepto en el lenguaje de programación. No lo recuerdo en línea por línea, pero él define el lenguaje funcional puro tiene que pasar la prueba de lenguaje declarativo que es:

"Dentro del alcance de la desaceleración específica de x1, ..., xn, toda la aparición de una expresión e que contiene solo variables x1, ..., xn tiene el mismo valor".

En resumen, ya que todos los demás mencionan libres de efectos secundarios o sin efectos secundarios ("falta" de efectos secundarios).

En lingüística, una frase de nombre o sustantivo se considera referencialmente transparente si puede reemplazarse con la otra frase nominal con el mismo referente sin cambiar el significado de la oración que contiene.

Que en el primer caso se mantiene pero en el segundo caso se vuelve demasiado extraño.

Caso 1: "Vi a Walter entrar en su nuevo coche."

Y si Walter posee un centro, entonces podríamos reemplazar eso en la oración dada como:

"Vi a Walter entrar en su Centro"

Contrariamente a primero:

Caso #2: fue llamado William Rufus Por su lectura de barba.

Rufus significa algo rojo y la referencia fue a William IV de Inglaterra.

"Fue llamado William IV Debido a su lectura de barba ". Parece demasiado incómodo.

La forma tradicional de decir que un lenguaje es referencialmente transparente si podemos reemplazar una expresión con otro valor igual en cualquier lugar del programa sin cambiar el significado del programa.

Entonces, la transparencia referencial es una propiedad del lenguaje funcional puro. Y si su programa está libre de efectos secundarios, esta propiedad se mantendrá.

Así que renunciar es un consejo increíble, pero obtenerlo también podría verse bien en este contexto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top