Programación funcional

Sin embargo, lenguajes de programación funcional como Lisp (Scheme, Common Lisp, etc.), Erlang, Rust, Objective Caml, Scala, F#, Clojure, Racket, Wolfram Language[2]​ y Haskell, también han sido utilizados en aplicaciones comerciales e industriales.

Otros lenguajes de programación no están diseñados específicamente para seguir un estilo funcional, sin embargo lo ofrecen como alternativa.

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitar el concepto de estado del cómputo.

La secuencia de computaciones llevadas a cabo por el programa se rige única y exclusivamente por la reescritura de definiciones más amplias a otras cada vez más concretas y definidas.

Esto le permite a uno expresar, por ejemplo, la función sucesor como el operador de suma aplicada parcialmente al número natural uno.

Tal y como las mayores funciones más comunes tienen un rol análogo para construir estructuras de control se tienen los iteradores en los lenguajes imperativos.

Los lenguajes funcionales pueden ser clasificados por el hecho de usar evaluación estricta(eager) o no estricta(lazy), conceptos que hacen referencia a cómo los argumentos de las funciones son procesados cuando una expresión está siendo evaluada.

La diferencia técnica está en la notación semántica de las expresiones que contienen cálculos fallidos o divergentes.

Por ejemplo, la expresión: fallará bajo evaluación estricta por la división por cero en el tercer elemento de la lista.

La evaluación no estricta es utilizada por defecto en multitud de lenguajes funcionales puros, incluidos Miranda, Clean y Haskell.

Los tipos dependientes pueden expresar proposiciones arbitrarias en la lógica de predicados intuicionista.

Si bien estos lenguajes son principalmente de interés en la investigación académica (incluyendo las matemáticas formalizadas), han comenzado a ser utilizados en la ingeniería también.

Compcert es un compilador para un subconjunto del lenguaje de programación C que está escrito en Coq y el cual se verificó formalmente.

Funciones de primera clase, se han añadido lentamente a los lenguajes principales.

Sin embargo, las clases anónimas no son siempre los reemplazos completos de las clausuras, ya que tienen capacidades más limitadas.

Mientras las mónadas existentes pueden ser fáciles de aplicar en un programa usando las plantillas y ejemplos adecuados, muchos estudiantes tienen problemas para entenderlo conceptualmente, por ejemplo cuando se les pide definir nuevas mónadas.

Los lenguajes funcionales no puros normalmente incluyen métodos para gestionar el cambio de estado más directamente.

Clojure por ejemplo, usa una gestión de referencias que pueden ser actualizadas aplicando funciones puras al estado actual.

Se puede acceder muy eficientemente a las posiciones del array con CPUs con un alto grado de perfeccionamiento, haciendo pre búsquedas eficientemente a través de las memorias caché o manejado con instrucciones SIMD.

Y no es fácil crear componentes homólogos inmutables de propósito general con la misma eficiencia.

Para programas que realizan cálculos numéricos intensivos, los lenguajes funcionales tales como OCaml y Clean son algo más lentos que C. Para programas que manejan grandes matrices y bases de datos multidimensionales, los vectores de los lenguajes funcionales, como J y K, fueron diseñados optimizando su velocidad.

Entre otros lenguajes que se podrían utilizar para programación funcional se podrían incluir a Perl, pues, aunque es un lenguaje de propósito muy general, se pueden realizar programas usando exclusivamente funciones definidas por el usuario; así como Python, como lenguaje que incorpora el paradigma funcional; o Ruby.

Sin embargo se han empezado a usar importantes lenguajes de programación funcionales en sistemas comerciales o industriales.

Otros lenguajes de programación funcionales han sido usados en ámbitos comerciales y financieros.

Captura con código fuente de Lisp , la familia más antigua de lenguajes de programación declarativa. El mismo programa usado para mostrar estas ventanas, StumpWM , a su vez está escrito en Lisp.
fold(f, [1,2,3,4,5]) Función de orden superior ¨ fold ¨ (también llamada "reduce"). Toma una función arbitraria f de aridad 2 (por ejemplo, la suma) así como una lista de argumentos. Luego aplica la función a una pareja de la lista, y el resultado se usa para aplicar la función recursivamente con el siguiente elemento de la lista. Esto puede ser usado, por ejemplo, para imitar un bucle "for" o "while" con una variable acumuladora o sumatoria .
Muestra de Haskell , un lenguaje moderno de programación funcional pura que incorpora avanzadas características de sistema de tipos y evaluación no estricta .