Esta pregunta surge de la pregunta /software/25569/is-haskell-worth-learning
En general, se hacen algunas declaraciones a menudo repetidas sobre cómo Haskell mejora sus habilidades de codificación en otros idiomas y, además, esto se debe a que Haskell no tiene estado y eso es algo bueno.
¿Por qué?
He visto a alguien comparar esto con solo escribir con la mano izquierda, o tal vez cerrar los ojos por un día y solo confiar en el tacto. ¿Seguramente hay más que eso?
¿Se relaciona con el acceso a la memoria del hardware o algo más que es una gran ganancia de rendimiento?
Respuestas:
Hay al menos tres grandes ventajas fuera de mi cabeza:
hace que los programas estén más cerca de las expresiones matemáticas. En matemáticas,
x
no cambia, simplemente no sabes lo que es hasta que resuelves la ecuación.Al final, no es cambio de estado (después de todo, así es como el equipo trabaja a bajo nivel); pero está limitado por el idioma a lugares específicos. eso le permite al compilador grandes oportunidades para mover el código para optimizarlo, ya que sabe que no cambia nada de lo que depende otro código.
El código concurrente no necesita sincronizarse para acceder a los datos que no cambian, por lo que se mejora la concurrencia, tanto en los sistemas de memoria compartida SMP (todos los sistemas multinúcleo de hoy) como en clústeres sueltos.
fuente
Aquí hay otra ventaja: acoplamiento reducido. Si tienes un código como:
y en otro lugar tienes:
entonces las dos funciones dependen implícitamente . No hay una manera fácil de saber que las llamadas
doStuff
se ven afectadas por las llamadasdoOtherStuff
. Sin estado mutable, tendría que hacer la conexión explícita.Por supuesto, este no es un problema con todos los estados mutables: el problema es con el estado mutable generalizado. La solución real es tener la inmutabilidad por defecto y alguna forma de "marcar" y restringir el estado mutable justo donde lo necesita.
fuente
Una respuesta simplificada es: cuando ve un nombre en un lenguaje puramente funcional, sabe cuál es el valor asociado mediante una simple búsqueda de su definición. Si tiene variables mutables, solo puede determinar por cuál de las varias asignaciones se ejecutó por última vez, por lo que también debe analizar el flujo de control, que a su vez puede ser condicional, dejándolo con múltiples posibilidades. Para obtener una explosión exponencial, solo debe tener en cuenta que el RHS de las asignaciones dependen de las variables, por lo que también debe analizarlas de forma recursiva.
La conclusión en el análisis anterior es que es insostenible sin comentarios que expliquen la intención, los invariantes y la semántica: estos pueden ser difíciles de interpretar y puede ser difícil verificar que la semántica se cumpla en el código real.
Esta respuesta es básicamente una expansión del punto 1 de @ Javier.
Creo que también es una explicación de la popularidad del régimen fraudulento de OO: con OO, el estado mutable se encapsula, lo que facilita mucho el análisis al localizar las mutaciones hasta cierto punto, y permite una expresión y verificación de la semántica mucho más robusta.
Habiendo notado eso, la programación funcional no es la respuesta. La respuesta correcta es un sistema que admite programación inductiva (funcional) y coinductiva (de procedimiento), por lo que las herramientas adecuadas pueden manejar tanto la programación sin estado como la de estado. Es solo que la teoría constructiva (funcional) está bien establecida, mientras que la teoría de la gestión estatal todavía está en pañales.
fuente
Como autor de Siege , un DBMS escrito en Haskell, algunos pueden considerar mi opinión sobre el estado mutable en conflicto. Espero mostrar lo contrario.
El propósito del estado mutable es describir el estado actual en el que se encuentra un sistema. Supongamos que tiene un blog y está respaldado por una base de datos, la base de datos describe las publicaciones que tiene en su blog en el momento en que realiza la consulta. eso. ¿Cuántas publicaciones existen en este momento?
Compare esto con el estado inmutable que se utiliza para transmitir hechos. ¿Cuántas publicaciones hubo el 12 de agosto?
Los hechos son fáciles de razonar, el estado mutable no lo es. Sin embargo, el estado mutable no es un efecto impuro malvado que debería ser desterrado del alcance de nuestras mentes; a menudo necesitamos que coexista en el mundo mutable en el que vivimos, solo necesitamos usarlo con más moderación.
fuente