¿Es Javascript un lenguaje de programación funcional?

135

Solo porque las funciones son objetos de primera clase, hay cierres y funciones de orden superior, ¿merece Javascript ser llamado un lenguaje de programación funcional? Lo principal que creo que le falta es Pure Functions, y no se siente como otros lenguajes funcionales, como lisp (aunque esa no es realmente una buena razón para que no sea un lenguaje funcional ...)

hvgotcodes
fuente
12
@slashmais: ¡No! Eso solo evita que sea un lenguaje puramente funcional. ML (al menos los dialectos modernos) también son impuros, pero nadie se atrevería a llamarlos no funcionales;)
44
Hay muchos lenguajes que comúnmente se consideran funcionales, pero que no son puros. No veo cómo eso es un requisito. Si quieres ser tan estricto, la mayoría de los llamados lenguajes OOP tampoco son OOP. Al final, aproximadamente el 95% de todos los idiomas son lenguajes sin paradigma.
jalf
66
¿Por qué importa sin embargo? Cuando codifico en C ++, no me importa si el lenguaje "es OOP" o no. Me importa que tenga ciertas características de OOP, y que tenga un par de características de programación funcionales, y muchas características de programación imperativas, y muchas características de programación genéricas. Pero si es "es-un" lenguaje OOP o un lenguaje FP o algo más no importa. Del mismo modo, cuando codifico en JS, no importa si es FP o no. Lo que importa es que admite muchas características agradables de FP. Parece que esta es la pregunta incorrecta que hacer.
jalf
3
@hvgotcodes: ¿y? No hay absolutamente ninguna regla que diga que no lo es. Mi regla general es que es un lenguaje funcional si puede usarlo para programar en un estilo funcional. Dado que Javascript tiene funciones de primera clase, cierres y lambdas, creo que puedes, y en lo que a mí respecta, es un lenguaje funcional. No es puro, obviamente, pero tampoco lo son la mayoría de los lenguajes que generalmente consideramos FP (SML por ejemplo). Así que realmente, creo que solo necesitas relajarte. Si eso hace que su ojo se contraiga, necesita ver a un médico.
jalf
3
@jalf, absolutamente. La motivación para la pregunta era que quería saber qué piensan mis compañeros y personas que son más inteligentes que yo.
hvgotcodes

Respuestas:

180

Repitiendo mi propia respuesta a una pregunta similar,

No hay una definición aceptada de lenguaje de programación funcional.

Si define el lenguaje funcional como el lenguaje que admite funciones de primera clase y lambdas, entonces sí, JavaScript * es * un lenguaje funcional.

Si también considera factores como la compatibilidad con la inmutabilidad, los tipos de datos algebraicos, la coincidencia de patrones, la aplicación parcial, etc., entonces no, JavaScript * no es * un lenguaje funcional.


Te animo a leer las siguientes publicaciones de blog relacionadas (y también los comentarios debajo de ellas):

missingfaktor
fuente
29
+1 por señalar que no existe una definición universal y por traer algunos ejemplos de características arquetípicas del lenguaje funcional que JS no tiene.
1
Las versiones posteriores de la implementación de JavaScript de Mozilla (con 1.7) tienen coincidencia de patrones en forma de tareas de desestructuración: developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeard4
JavaScript tiene la noción de parciales y de aplicación parcial de parámetros, por lo que me pregunto si su afirmación de que no admite esto es incorrecta.
johnbakers
2
@OpenLearner, la aplicación parcial es compatible con casi todos los idiomas que se me ocurren, incluso C. Para una cierta definición de "soporte" de todos modos. El caso con JS no es diferente. El punto es si la aplicación parcial es fácil y de primera clase en ese idioma. En JS, no lo es. Si tiene curiosidad sobre lo que quiero decir, eche un vistazo a OCaml o Haskell.
missingfaktor
JavaScript admite la inmutabilidad afaik.
fka
26

Yo diría que es un lenguaje multi-paradigmático.

EDITAR: es multi-paradigma e incluye construcciones funcionales.

Niki Yoshiuchi
fuente
Sí, estoy de acuerdo en que es una mezcla y varias cosas diferentes.
Ashley Grenon
55
pero eso no responde a la pregunta de si es también funcional. Ser multi-paradigma implica soportar múltiples paradigmas. ¿Es uno de estos paradigmas de programación funcional?
jalf
15

Si estira y tuerce el término "programación funcional" hasta el punto de discusiones filosóficas, esta pregunta puede volver a estar abierta. Sin embargo, entonces terminas en el nivel de preguntas útiles como "¿C ++ es realmente un lenguaje de programación"?

La respuesta a su pregunta en un nivel más diario es "no" .

La programación funcional significa que el programa se conceptualiza como una evaluación de una función, en lugar de un flujo de control. El código es una descripción de funciones y no tiene un concepto inherente de flujo de control.

JavaScript tiene un flujo de control y está conceptualizado como un lenguaje imperativo. Desde su objetivo de diseño, claramente no es un lenguaje funcional.

shuhalo
fuente
1
objetivo de diseño? ¿Qué quieres decir? Lo último que revisé, una de sus fuentes de inspiración fue Scheme. Yo diría que está bastante claro que uno de sus objetivos de diseño fue el apoyo a la programación funcional , así como un cubo de otros paradigmas
JALF
2
Es compatible con la programación funcional tanto como C ++, si escribe las bases apropiadas para esto usted mismo, tanto como puede emular la sintaxis imperativa en, digamos, Haskell con un poco de trabajo. Sin embargo, la sintaxis de JavaScript hace que se considere un flujo de trabajo en lugar de la evaluación de una función. Por esa razón, yo (o la mayoría de los programadores funcionales) considero que aplicar el término "funcional" es demasiado extenso.
shuhalo
@ user411768: ¿está diciendo que si un idioma es funcional o no depende del diseño de su biblioteca estándar? Nunca he escuchado esa definición antes. Java tiene la mayoría de las herramientas necesarias para programar en un estilo funcional (cierres y funciones anónimas, por ejemplo), que C ++ (actualmente) no tiene. Creo que eso hace que JS sea mucho más FP que C ++. El hecho de que el lenguaje no te obligue a programar en un estilo FP no lo hace "menos funcional", ¿verdad?
jalf
1
(i) La biblioteca estándar es parte del estándar, al igual que las características sintácticas, y enfatiza un cierto estilo idiomático y conceptual. Por ejemplo, "C ++ con STL" es muy diferente de "C con clases". Tiene un impacto. (ii) JavaScript presenta orientación a objetos, funciones de ciudadanos de primera clase: las características son bastante ortogonales a la dicotomía imperativ / funcional. Sin embargo, ni implementa directamente el curry, ni proporciona pureza, ni ha sido destinado para esto. (iii) Mis últimas palabras sobre eso, ver el primer párrafo de la publicación.
shuhalo
3
La afirmación de que JavaScript y C ++ ofrecen las mismas comodidades de programación funcional es ciertamente errónea. JavaScript hace que la programación funcional sea bastante sencilla y simple sin todas las construcciones desordenadas que debe seguir en C ++ para lograr lo mismo. Hay muchos grandes codificadores de C ++ que dicen prominentemente que la programación funcional realmente no se recomienda en C ++, sin embargo, abundan los artículos sobre programación funcional en JavaScript
johnbakers
9

El término lenguaje de "programación funcional" está tan sobrecargado en estos días que es casi inútil. Hay dos significados dominantes:

  1. Tiene funciones de primera clase.
    • Javascript es esto!
  2. Se basa en funciones tal como se utilizan en el cálculo lambda, con énfasis en evitar el estado mutable persistente (a menudo reemplazándolo con parámetros pasados ​​a funciones)
    • Como se escribe comúnmente, ¡Javascript no es remotamente esto!

Elija su significado y luego la pregunta es responsable.

Arrojar
fuente
¿Existe alguna fuente que use "programación funcional" para referirse a lenguajes con funciones que sean ciudadanos de primer orden?
shuhalo
@ user411768: En realidad, otro respondedor vinculado al artículo de Wikipedia, que utiliza esa definición. en.wikipedia.org/wiki/Javascript - Joel Spolsky también implicó esta definición en su "¿Puede su lenguaje de programación hacer esto?" publicar sobre los beneficios de la "programación funcional"
Chuck
Usted observa que, como se escribe comúnmente, JavaScript no está utilizando su segundo punto, pero eso ciertamente no significa que no haya programadores haciendo exactamente eso, y que el lenguaje no admite tal característica, porque ciertamente lo hace
johnbakers
@OpenLearner: Bueno, sí, pero lo mismo puede decirse de Java y un montón de otras lenguas que se consideran generalmente ser estrictamente imprescindible - se puede escribir en un estilo funcional, pero no es feliz camino de la lengua.
Chuck
... pero el último JS lo admitiría.
Erik Reppen
3

No creo que haya una definición concreta de programación funcional, sin embargo, muchas de las cosas que las personas consideran "programación funcional" se pueden hacer con javascript. Aquí hay un buen breve ejemplo en este artículo.

Marknery
fuente
2

Para mí, Javascript es tanto un lenguaje imperativo como un lenguaje funcional, y puede elegir usarlo de cualquier manera, e incluso ( egad ) en ambos sentidos. O puede elegir usar un paradigma y nunca tocar el otro. Tu decides. Yo, como usted, no creo que Javascript deba llamarse un lenguaje funcional, ya que le permite entrar y salir del paradigma de programación funcional. Quizás si tuviera un pragma de algún tipo, limitarlo usando solo paradigmas de programación funcional, entonces sería útil, creo. Pero, en resumen, digo que es más un lenguaje imperativo / de procedimiento con algunas características de programación funcional incorporadas.

Brian Onn
fuente
Por ese razonamiento, F # ya no puede llamarse funcional.
Eric Mickelsen
1
Correcto. Según Wikipedia, F # es exactamente lo que acabo de llamar Javascript: "F # [...] es un lenguaje de programación multi-paradigmático [...] que abarca la programación funcional así como las disciplinas de programación orientadas a objetos imperativos"
Brian Onn
2

Tiendo a pensar que los lenguajes de programación no tienen un paradigma particular, sino que se prestan a ciertos paradigmas. Sin embargo, solo porque se prestan a un paradigma particular no significa que tenga que usar ese paradigma. Es muy posible escribir programas orientados a objetos en C y escribir programas imperativos en ML. No usar un cierto paradigma para resolver un problema porque el lenguaje no está diseñado para ello solo te limita artificialmente (por supuesto, aún debes tener en cuenta las limitaciones de un idioma al decidir si una solución en particular será una buena solución).

David Brown
fuente
0

Bueno, no diría que es una programación funcional, pero luego lo haría decir que es orientado a objetos y justo hoy un amigo dijo que no lo pondría en ese estante tampoco.

Entonces, aunque no diría que es así, creo que hay espacio para la opinión. Tiene características clásicas de programación funcional, no tiene otras.

slezica
fuente
2
JavaScript está orientado a objetos. OO no requiere clases, sin embargo requiere objetos.
Incógnito
3
Javascript no está orientado a objetos, está basado en prototipos.
Kris
1
JavaScript está programando sopa. Un poco de esto y un poco de aquello.
Andrew S
0

Javascript es a un punto. Realmente depende de cómo lo programes. Si codifico de manera OO, ¿no sería OO? Entonces, si solo codifica las cosas de manera 'funcional', sería funcional. Supongo que es un lenguaje de paradigmas múltiples, por lo que llamarlo solo una cosa no es del todo exacto.


fuente
0

@petraszd Reescribo un poco su código para obtener un "nuevo" para el operador:

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

Pero sé que de esta manera tiene desventajas para los bucles grandes ...

Pregunta relacionada sobre la optimización del recurtion de cola en JS

PD Publicado aquí porque tiene problemas con el formato del código al publicar como comentario

aeracode
fuente
0

¡En Javascript, puedes hacer algo como esto!

// Data
var fruits = [
    { name: 'apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

He creado una página de github para demostrar este concepto y puedes clonar / ver mi implementación

Wayne Chiu
fuente
0

Como sabemos, el lenguaje de programación funcional no permite cambiar o mutar los elementos (estado) de las funciones, pero en JavaScript está permitido en ese sentido, no es un lenguaje de programación funcional, aunque trata la función como ciudadanos de primera clase.

Sourabh Ranka
fuente
-2

Lo que realmente odio en javascript (si intentas verlo como lenguaje FP) es esto:

function getTenFunctionsBad() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push(function () {
      return i;
    });
  }
  return result;
}

function getTenFunctions() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push((function (i) {
      return function () {
        return i;
      }
    })(i));
  }
  return result;
}

var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
  // using rhino print
  print(functionsBad[i]() + ', ' + functions[i]());
}

// Output:
//   10, 0
//   10, 1
//   10, 2
//   10, 3
//   10, 4
//   10, 5
//   10, 6
//   10, 7
//   10, 8
//   10, 9

Debe comprender el entorno de pila JS (no lo sé si es el término correcto) para comprender este comportamiento.

En el esquema, por ejemplo, simplemente no puede producir tal cosa (Ok, ok, con la ayuda de las referencias de los idiomas subyacentes, puede hacerlo):

(define (make-ten-functions)
  (define (iter i)
    (cond ((> i 9) '())
          (else (cons (lambda () i) (iter (+ i 1))))))
  (iter 0))

(for-each (lambda (f)
            (display (f))
            (newline)) (make-ten-functions))
petraszd
fuente
1
Hm, creo que Javascript tiene referencia a variable pero no contiene referencia a valor .
aeracode
1
Comprender el alcance variable es fundamental para una programación efectiva en cualquier lenguaje. Javascript no está solo en esto.
rico remer