StackOverflow me señaló aquí, por lo que la pregunta podría ser un poco simple.
Wikipedia define funciones puras como
En la programación de computadoras, una función puede describirse como una función pura si ambas afirmaciones sobre la función tienen:
- La función siempre evalúa el mismo valor de resultado dados los mismos valores de argumento. El valor del resultado de la función no puede depender de ninguna información oculta o estado que pueda cambiar a medida que avanza la ejecución del programa o entre diferentes ejecuciones del programa, ni puede depender de ninguna entrada externa de los dispositivos de E / S.
- La evaluación del resultado no causa ningún efecto secundario o salida semánticamente observable, como la mutación de objetos mutables o la salida a dispositivos de E / S.
Sin embargo, no parece citar ninguna fuente, por lo que es difícil decir si esta es una definición aceptada o quién la definió de esta manera.
Cuando miro lo que hacen los idiomas cuando incluyen una sintaxis / anotación para funciones "puras", hay varios enfoques diferentes:
- En D, la única limitación es la no mutación del estado global. Las funciones "puras" pueden mutar sus argumentos.
- En GCC hay dos tipos de "puro":
pure
(sin efectos secundarios, pero puede leer el estado global) yconst
(estrictamente puro según la definición de Wikipedia). - En C # , se define como "no realiza ningún cambio de estado visible" (sea lo que sea).
- Haskell sigue la definición de Wikipedia.
Entonces mi pregunta es: ¿hay una definición canónica de función pura?
Y si existe, ¿cuál es su fuente?
terminology
functional-programming
semantics
Andrey Shchekin
fuente
fuente
Respuestas:
Como se señaló en este documento Imperative Functional Programming , (1993) de Peyton-Jones y Wadler (entre el grupo de investigadores que crearon Haskell):
La atención se centra en la ausencia de efectos secundarios para permitir las transformaciones del programa (es decir, optimizaciones del compilador).
¿Qué son los efectos secundarios? Este documento a su vez apunta a la integración de la programación funcional e imperativa (1986) de Gifford y Lucassen, que menciona cuatro tipos de clases de efectos : Puro, Función, Observador y Procedimiento. Entonces, el término "función pura" se deriva de este artículo.
Sin embargo, tenga en cuenta que Peyton-Jones y Wadler mencionaron deficiencias en este enfoque. Vale la pena notar, dicen, que es el lenguaje de programación Clean que utiliza tipos lineales para introducir efectos secundarios de manera segura (es decir, seguro para el compilador). Básicamente, distribuye el mundo como una variable en todas las funciones relacionadas con E / S, incluido el punto de entrada principal .
Con eso, es posible tener un lenguaje funcional puro que interactúe con el mundo y tenga efectos secundarios (E / S, el sistema operativo, el sistema de ventanas, etc.), contradiciendo parcialmente su definición de wikipedia. De hecho, se puede decir que Haskell tiene a Clean como uno de sus influenciadores; aunque se aparta de los tipos lineales y utiliza otra construcción de nivel de tipo (mónadas) para garantizar la linealidad, es decir, una referencia única en todo momento.
fuente
(f_handle, world2) = fopen file_name, world
(pseudocódigo) y tendrá que usar una próxima llamadaworld2
. En esencia, los programas son vistos como operando en el Universo como un todo. Dicho de otra manera, no hay efectos secundarios cuando estás operando en el Universo :-)La definición de Wikipedia es canónica. Los dos requisitos cruciales son:
El valor de retorno y el comportamiento de la función es una función determinista de los argumentos que se pasaron explícitamente a la función.
Una invocación de la función no tiene efectos secundarios observables.
Estrictamente hablando, D y gcc no deberían usar la palabra "puro" como lo hacen; Es un abuso de la terminología estándar.
fuente