f# - caracteristicas - programacion funcional c#
¿La programación funcional evita el estado? (4)
Creo que solo estás usando el término "estado" de una manera inusual. Si considera que agregar 1 y 1 para obtener 2 como estado, entonces podría decir que la programación funcional abarca el estado. Pero cuando la mayoría de la gente dice "estado", significa almacenar y cambiar valores, de modo que llamar a una función puede dejar cosas diferentes a como se llamaba antes, y llamar a la función por segunda vez con la misma entrada podría no tener el mismo resultado.
Esencialmente, los cálculos sin estado son cosas como esta:
- El resultado de 1 + 1.
- La cadena que consta de ''s'' se antepone a "pool"
- El área de un rectángulo dado
Los cálculos de estado son cosas como esta:
- Incrementar un contador
- Eliminar un elemento de la matriz
- Establece el ancho de un rectángulo para que sea el doble de lo que es ahora
Según wikipedia : la programación funcional es un paradigma de programación que trata la computación como la evaluación de funciones matemáticas y evita el estado y los datos mutables. (énfasis mío).
¿Es esto realmente cierto? Mi entendimiento personal es que hace que el estado sea más explícito, en el sentido de que la programación es esencialmente aplicar funciones (transformaciones) a un estado determinado para obtener un estado transformado. En particular, las construcciones como mónadas le permiten llevar el estado explícitamente a través de funciones. Tampoco creo que ningún paradigma de programación pueda evitar el estado por completo.
Entonces, ¿es correcta o incorrecta la definición de wikipedia? Y si está mal, ¿cuál es la mejor manera de definir la programación funcional?
Edit : supongo que un punto central en esta pregunta es ¿qué es el estado? ¿Entiende que el estado es una variable o un atributo de objeto (datos mutables) o el estado de datos inmutables también lo es? Para tomar un ejemplo (en F #):
let x = 3
let double n = 2 * n
let y = double x
printfn "%A" y
¿Dirías que este fragmento contiene estado o no?
Edit 2 : Gracias a todos por participar. Ahora entiendo que el tema es más una discrepancia lingüística, con el uso de la palabra state
difiere de una comunidad a otra, como lo menciona Brian en su comentario. En particular, muchos en la comunidad de programación funcional (principalmente Haskellers) interpretan el state
para transmitir algún estado de dinamismo como una señal que varía con el tiempo. Otros usos del state
en cosas como la máquina de estados finitos , la transferencia de estado representativa y los protocolos de red sin estado pueden significar cosas diferentes.
En lugar de evitar el estado, piénsalo así:
Evita el cambio de estado. Esa palabra "mutable".
Piense en términos de un objeto C # o Java. Normalmente llamaría a un método en el objeto y podría esperar que modifique su estado interno como resultado de esa llamada de método.
Con la programación funcional, todavía tiene datos, pero solo pasa a través de cada función, creando una salida que corresponde a la entrada y la operación.
Al menos en teoría. En realidad, no todo lo que haces funciona funcionalmente, por lo que con frecuencia terminas escondiéndote para hacer que las cosas funcionen.
Editar:
Por supuesto, el estado de ocultación también conduce con frecuencia a algunos errores espectaculares, por lo que solo debe usar lenguajes de programación funcionales para situaciones puramente funcionales. Descubrí que los mejores idiomas son los que están orientados a objetos y son funcionales, como Python o C #, lo que le brinda lo mejor de ambos mundos y la libertad de moverse entre ellos según sea necesario.
La definición de Wikipedia es correcta. La programación funcional evita el estado. Programación funcional significa que aplica una función a una entrada determinada y obtiene un resultado. Sin embargo, se garantiza que su entrada no se modificará de ninguna manera. No significa que no puedas tener un estado en absoluto. Las mónadas son el ejemplo perfecto de eso.
La definición de Wikipedia es correcta. Puede parecer desconcertante al principio, pero si comienza a trabajar con Saykell, notará que no tiene ninguna variable que contenga valores.
El estado todavía puede ser representado de alguna manera usando mónadas estatales .