¿Puede * cualquier * tarea del programa expresarse sin estado?

13

Esta es una pregunta teórica, pero después de muchos años de programación en lo que ahora me doy cuenta es una técnica imperativa "normal", utilizando C ++ principalmente, he descubierto este otro mundo de programación funcional, con el que tropecé accidentalmente mientras aprendía casualmente JavaScript.

Esto me ha llevado a preguntarme si podría reemplazar técnicamente cualquier programa completo orientado hacia el estado con una implementación diferente que sea puramente funcional y sin estado.

Es una idea intrigante y debo admitir que hay una claridad y elegancia en la programación funcional que realmente me ha sorprendido.

    
pregunta johnbakers 14.10.2013 - 08:19

5 respuestas

17

Respuesta corta: si. Según Wikipedia, la equivalencia de cálculo lambda a las máquinas de Turing como modelo universal de cálculo se mostró en 1937 por Alan Turing. El modelo computacional de una máquina de Turing es lo que normalmente tiene en mente cuando habla de la programación imperativa o con estado, y el cálculo lambda es una formalización matemática de la "programación funcional pura".

Se conjetura que cada modelo efectivo de cálculo es capaz de realizar los mismos cálculos que una máquina de Turing, y viceversa. Esto se llama tesis de Church-Turing . Sin embargo, esta conjunción no se puede probar, debido al término más o menos intuitivo "modelo efectivo de computación" (¿quizás alguien inventará un nuevo modelo en el futuro?)

    
respondido por el Doc Brown 14.10.2013 - 08:28
14

En cualquier sistema dinámico, el "estado" es lo que hace que su presente sea influenciado por su pasado o futuro (la flecha de el tiempo no es un problema matemático, solo una restricción física).

Si tienes algo que "recordar" o que depende de lo que hiciste, tienes un estado.

Un sistema sin estado no es "dinámico": es solo una función combinatoria. Es posible que no tenga un estado, pero, para obtener resultados diferentes, se necesita un estado que se proporcione de alguna manera.

Ahora, dependiendo del modelo computacional al que se refiera, un estado puede representarse explícitamente (en forma de variable) o implícitamente (en forma de "direcciones de retorno").

cuando haces fna(fnb(x)) le das un estado a fnb que a su vez producirá un estado para fna. Esto se debe al hecho de que x existe antes de llamar a fnb (por lo tanto, proviene de su propio "pasado").

No es una cuestión de "estado exisit" o "estado no existe". Es un asunto de "Me importa" o "No me gusta".

    
respondido por el Emilio Garavaglia 14.10.2013 - 09:03
0

Estado significa la capacidad de responder a un estímulo presente de una manera que depende de estímulos pasados, no solo basado en el estímulo presente.

Los programas puramente funcionales son solo funciones. Por lo tanto, para aplicaciones prácticas, el programa puramente funcional ingresa un par (old_state * present_stimulus) y genera un par (new_state * present_response). Se necesita un "looper" externo y con estado para esperar el siguiente estímulo y propagar el estado.

Un programa puramente funcional no tiene un estado intrínseco, y -no se puede usar para aplicaciones prácticas directamente.

Por lo tanto, no el programa orientado por el estado puede ser reemplazado por una implementación diferente que sea puramente funcional y sin estado.

    
respondido por el Atsby 20.05.2015 - 11:24
0

Puedes evitar el estado mutable explícito siempre que no tengas que interactuar con el mundo exterior.

En JavaScript para que su programa tenga un efecto que vaya más allá de los ciclos de procesamiento, debe modificar el objeto Dom o el objeto Window, y estas API tienen estado. Pero supongo que podría crear una envoltura que pasara los objetos Dom y Window como parámetros al código JavaScript y luego recibiera una nueva Dom / Window como salida. Esto aislaría el código JavaScript del estado mutable.

Por supuesto que todavía estás confiando en el estado, ya que la ventana del navegador y el DOM son de estado por naturaleza. Cualquier aplicación interactiva tiene un estado inherente, pero aún puede estructurar su código de manera tal que minimice el estado explícito.

Una pregunta diferente es si es una buena idea. Incluso Haskell, que es un lenguaje funcional puro por diseño, incluye la mónada 'state', que le permite simular un estado mutable. Esto muestra que el estado mutable explícito a veces realmente es un patrón deseable.

    
respondido por el JacquesB 20.05.2015 - 13:20
0

Piense en cómo implementaría una "máquina de estado" en un lenguaje de programación sin estado.

Probablemente podría hacerlo, pero terminaría usando nombres de funciones como almacenamiento. Acabar con un buen rollo como:

if (sm.atBegining()) sm.start() else if (sm.done()) sm.stop() ) else sm.progress()
    
respondido por el James Anderson 20.05.2015 - 13:30

Lea otras preguntas en las etiquetas