En muchos artículos, que describen los beneficios de la programación funcional, he visto lenguajes de programación funcional, como Haskell, ML, Scala o Clojure, denominados "lenguajes declarativos" distintos de los lenguajes imperativos como C / C ++ / C # / Java. Mi pregunta es qué hace que los lenguajes de programación funcionales sean declarativos en lugar de imperativos.
Una explicación frecuente que describe las diferencias entre la programación declarativa y la imperativa es que en la programación imperativa usted le dice a la computadora "Cómo hacer algo" en lugar de "Qué hacer" en los lenguajes declarativos. El problema que tengo con esta explicación es que constantemente estás haciendo ambas cosas en todos los lenguajes de programación. Incluso si baja al ensamblaje del nivel más bajo, todavía le está diciendo a la computadora "Qué hacer", le dice a la CPU que agregue dos números, no le indica cómo realizar la suma. Si vamos al otro extremo del espectro, un lenguaje funcional puro de alto nivel como Haskell, de hecho le estás diciendo a la computadora cómo lograr una tarea específica, eso es lo que su programa es una secuencia de instrucciones para lograr una tarea específica que la computadora no sabe cómo lograr sola. Entiendo que lenguajes como Haskell, Clojure, etc. son obviamente de un nivel más alto que C / C ++ / C # / Java y ofrecen características tales como evaluación perezosa, estructuras de datos inmutables, funciones anónimas, currículum, estructuras de datos persistentes, etc. Programación funcional posible y eficiente, pero no los clasificaría como lenguajes declarativos.
Un lenguaje declarativo puro para mí sería uno que esté compuesto únicamente por declaraciones, un ejemplo de tales lenguajes sería CSS (Sí, sé que CSS técnicamente no sería un lenguaje de programación). CSS solo contiene declaraciones de estilo que son utilizadas por el HTML y Javascript de la página. CSS no puede hacer nada más que hacer declaraciones, no puede crear funciones de clase, es decir, funciones que determinan el estilo para mostrar en función de algún parámetro, no puede ejecutar scripts CSS, etc. Eso para mí describe un lenguaje declarativo (note que no dije declarativo lenguaje de programación ).
Actualizar:
He estado jugando con Prolog recientemente y para mí, Prolog es el lenguaje de programación más cercano a un lenguaje totalmente declarativo (al menos en mi opinión), si no es el único lenguaje de programación completamente declarativo. La elaboración de la programación en Prolog se realiza mediante declaraciones que establecen un hecho (una función de predicado que devuelve verdadero para una entrada específica) o una regla (una función de predicado que devuelve verdadero para una condición / patrón determinado en función de las entradas), reglas se definen utilizando una técnica de coincidencia de patrones. Para hacer cualquier cosa en el prólogo, consulta la base de conocimiento sustituyendo una o más de las entradas de un predicado con una variable y el prólogo intenta encontrar valores para las variables para las cuales el predicado tiene éxito.
Mi punto es en el prólogo que no hay instrucciones imperativas, básicamente le dice (declara) a la computadora lo que sabe y luego pregunta (consulta) sobre el conocimiento. En los lenguajes de programación funcionales, todavía está dando instrucciones, es decir, tome un valor, llame a la función X y agregue 1, etc., incluso si no está manipulando directamente las ubicaciones de memoria o escribiendo el cálculo paso a paso. No diría que la programación en Haskell, ML, Scala o Clojure es declarativa en este sentido, aunque puedo estar equivocado. Es propia, verdadera, pura programación funcional declarativa en el sentido que describí anteriormente.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(espero que lo hayas entendido, Clojure). Mi pregunta original es qué hace que esto sea diferente de este int. x = 1; x += 2; x *= x; return x;
En mi opinión, es casi lo mismo.