Los lenguajes funcionales, por definición, no deben mantener variables de estado. ¿Por qué, entonces, Haskell, Clojure y otros proporcionan implementaciones de software de memoria transaccional (STM)? ¿Hay un conflicto entre dos enfoques?
functional-programming
haskell
clojure
stm
Michael Spector
fuente
fuente
Respuestas:
No hay nada de malo en que un lenguaje funcional mantenga un estado mutable. Incluso los lenguajes funcionales "puros" como Haskell necesitan mantener el estado para interactuar con el mundo real. Los lenguajes funcionales "impuros" como Clojure permiten efectos secundarios que pueden incluir el estado mutante.
El punto principal es que los lenguajes funcionales desalientan el estado mutable a menos que realmente lo necesite . El estilo general es programar usando funciones puras y datos inmutables, y solo interactuar con el estado mutable "impuro" en las partes específicas de su código que lo requieren. De esa manera, puede mantener el resto de su base de código "puro".
Creo que hay varias razones por las cuales STM es más común en lenguajes funcionales:
Personalmente, me gusta el enfoque de Clojure de permitir la mutabilidad, pero solo en el contexto de "referencias administradas" estrictamente controladas que pueden participar en transacciones STM. Todo lo demás en el lenguaje es "puramente funcional".
Tenga en cuenta que el código anterior es totalmente transaccional y atómico: un observador externo que lea los dos saldos dentro de otra transacción siempre verá un estado atómico constante, es decir, los dos saldos siempre sumarán 200. Con la concurrencia basada en el bloqueo, este es un problema sorprendentemente difícil. para resolver en un sistema complejo grande con muchas entidades transaccionales.
Para una iluminación adicional, Rich Hickey hace un excelente trabajo al explicar el STM de Clojure en este video
fuente
Tu definición es incorrecta. El lenguaje que no puede mantener el estado simplemente no se puede usar.
La diferencia entre los lenguajes funcionales e imperativos no es que uno de ellos tenga estado y el otro no. Es en cierto modo que mantienen el estado.
Los lenguajes imperativos tienen un estado extendido por todo el programa.
Los lenguajes funcionales aíslan y mantienen el estado explícitamente mediante firmas de tipo. Y esa es la razón por la que proporcionan mecanismos sofisticados de gestión del estado como STM.
fuente
A veces, un programa requiere un estado mutable (por ejemplo, contenido de la base de datos para una aplicación web) y sería genial poder usarlo sin perder los beneficios de la programación funcional. En lenguajes no funcionales, el estado mutable impregna todo. Si lo hace explícito con algún tipo de API especial , puede limitarlo a una pequeña región identificable mientras todo lo demás sigue siendo puramente funcional. Los beneficios de FP incluyen una depuración más fácil, pruebas unitarias repetibles, concurrencia indolora y compatibilidad multinúcleo / GPU.
fuente