Javascript é uma linguagem de programação funcional?


135

Só porque as funções são objetos de primeira classe, existem fechamentos e funções de ordem superior, o Javascript merece ser chamado de linguagem de programação funcional? A principal coisa que acho que falta é o Pure Functions, e não 'parece' com outras linguagens funcionais, como o lisp (embora isso não seja realmente um bom motivo para não ser um idioma funcional ...)


12
@slashmais: Não! Isso apenas o impede de ser uma linguagem pura (funcional). ML (pelo menos dialetos modernos) também são impuros - mas ninguém se atreveria a chamá-los de não funcionais;)

4
Existem muitos idiomas que são geralmente considerados funcionais, mas que não são puros. Não vejo como isso é um requisito. Se você quer ser tão rigoroso, a maioria das chamadas linguagens OOP também não é OOP. Você acaba com cerca de 95% de todos os idiomas sendo idiomas sem paradigma.
jalf

6
Por que isso importa? Quando codifico em C ++, não me importo se a linguagem "é OOP" ou não. Eu me importo que ele tenha certos recursos de POO e que tenha alguns recursos de programação funcional, muitos recursos de programação imperativos e muitos recursos de programação genéricos. Mas se é "uma" linguagem OOP ou FP, ou qualquer outra coisa, não importa. Da mesma forma, quando eu codigo em JS, não importa se é FP ou não. O que importa é que ele suporta muitos recursos agradáveis ​​de FP. Parece que esta é a pergunta errada a ser feita.
jalf

3
@hvgotcodes: so? Não há absolutamente nenhuma regra dizendo que não é. Minha regra geral é que é uma linguagem funcional se você pode usá-la para programar em um estilo funcional. Como o Javascript possui funções, fechamentos e lambdas de primeira classe, acredito que você pode e, no que me diz respeito, é uma linguagem funcional. Não é puro, obviamente, mas nem a maioria dos idiomas que normalmente consideramos FP (SML, por exemplo). Realmente, acho que você só precisa relaxar. Se isso faz seu olho se contorcer, você precisa consultar um médico.
jalf

3
@ jalf, absolutamente. A motivação para a pergunta foi: eu queria saber o que meus colegas e pessoas mais inteligentes do que eu pensam.
Hvgotcodes 19/10/10

Respostas:


180

Repetindo minha própria resposta a uma pergunta semelhante,

Não há definição aceita de linguagem de programação funcional.

Se você definir linguagem funcional como a linguagem que suporta funções e lambdas de primeira classe, sim, JavaScript * será * uma linguagem funcional.

Se você também considerar fatores como suporte à imutabilidade, tipos de dados algébricos, correspondência de padrões, aplicação parcial etc., então não, o JavaScript * não é * uma linguagem funcional.


Recomendamos que você leia as seguintes postagens de blog relacionadas (e também os comentários abaixo):


29
+1 por apontar que não há definição universal e trazer alguns exemplos de recursos arquetípicos da linguagem funcional que JS não possui.

1
Versões posteriores da implementação de JavaScript (olhando com 1,7) da Mozilla tem padrão de correspondência na forma de atribuições desestruturação: developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeard4

JavaScript tem a noção de parciais e aplicação parcial de parâmetros, por isso, pergunto-me se sua afirmação de que não suporta isso está incorreta?
johnbakers

2
@ OpenLearner, o aplicativo parcial é suportado por praticamente todos os idiomas em que consigo pensar, até mesmo C. Para uma certa definição de "suporte" de qualquer maneira. O caso com JS não é diferente. A questão é se a aplicação parcial é fácil e de primeira classe nesse idioma. Em JS, não é. Se você está curioso sobre o que quero dizer, dê uma olhada no OCaml ou Haskell.
missingfaktor

O JavaScript suporta a imutabilidade depois.
fka

26

Eu diria que é uma linguagem multiparadigma.

EDIT: É multi-paradigma e inclui construções funcionais.


Sim, eu concordo que é uma mistura e várias coisas diferentes.
Ashley Grenon

5
mas isso não responde à questão de saber se também é funcional. Ser multiparadigma implica apoiar múltiplos paradigmas. Um desses paradigmas é programação funcional?
jalf

15

se você esticar e distorcer o termo "programação funcional" ao ponto de discussões filosóficas, essa questão poderá ser aberta novamente. No entanto, você acaba no nível de perguntas úteis como "C ++ é realmente uma linguagem de programação"?

A resposta para sua pergunta em um nível mais diário é "não" .

Programação funcional significa que o programa é conceitualizado como uma avaliação de uma função, e não como um fluxo de controle. O código é uma descrição das funções e não possui um conceito inerente de um fluxo de controle.

O JavaScript possui um fluxo de controle e é conceitualizado como uma linguagem imperativa. Do seu objetivo de design, claramente não é uma linguagem funcional.


1
objetivo do projeto? O que você quer dizer? A última vez que verifiquei, uma de suas fontes de inspiração foi Scheme. Eu diria que é bastante claro que um dos seus objectivos de design era apoiar a programação funcional , bem como um balde de outros paradigmas
jalf

2
Ele suporta programação funcional tanto quanto o C ++, se você escrever as bases apropriadas para isso sozinho - o máximo que puder emular a sintaxe imperativa, digamos, em Haskell, com um pouco de trabalho. No entanto, a sintaxe do JavaScript faz com que seja considerado um fluxo de trabalho, e não a avaliação de uma função. Por esse motivo, eu (ou a maioria dos programadores funcionais) considero a aplicação do termo "funcional" muito extensa.
shuhalo

@ user411768: então você está dizendo que se uma linguagem é ou não funcional depende do design de sua biblioteca padrão? Eu nunca ouvi essa definição antes. Java possui a maioria das ferramentas necessárias para programar em um estilo funcional (fechamentos e funções anônimas, por exemplo), que o C ++ (atualmente) não possui. Eu acho que isso torna o JS muito mais FP do que o C ++. O fato de a linguagem não forçar você a programar em um estilo FP não a torna "menos funcional", não é?
jalf

1
(i) A biblioteca padrão faz parte do padrão, assim como os recursos sintáticos, e enfatiza um certo estilo idiomático e conceitual. Por exemplo, "C ++ com STL" é muito diferente de "C com classes". Isso tem um impacto. (ii) JavaScript apresenta orientação a objetos, funções de cidadão de primeira classe - os recursos são ortogonais à dicotomia imperativa / funcional. No entanto, nem implementa diretamente o curry, nem fornece pureza, nem nunca foi destinado a isso. (iii) Minhas últimas palavras sobre isso, veja o primeiro parágrafo do post.
shuhalo

3
A afirmação de que JavaScript e C ++ oferecem as mesmas conveniências de programação funcional certamente está errada. O JavaScript torna a programação funcional bastante direta e simples, sem todas as construções confusas pelas quais você deve passar em C ++ para obter a mesma coisa. Há uma abundância de codificadores grande C ++ que proeminentemente dizer que programação funcional realmente não é incentivado em C ++, no entanto artigos sobre como fazer programação funcional em JavaScript abundam abundantes
johnbakers

9

O termo linguagem "programação funcional" está tão sobrecarregado hoje em dia que é quase inútil. Existem dois significados dominantes:

  1. Possui funções de primeira classe
    • Javascript é este!
  2. Baseia-se em funções usadas no cálculo lambda, com ênfase em evitar o estado mutável persistente (geralmente substituindo-o por parâmetros passados ​​para funções)
    • Como geralmente escrito, o Javascript não é remotamente isso!

Escolha o seu significado e, em seguida, a pergunta é respondida.


Existe uma fonte que use "programação funcional" para se referir a linguagens com funções de cidadãos de primeira ordem ?.
shuhalo

@ user411768: Na verdade, outro respondente vinculado ao artigo da Wikipedia, que usa essa definição. pt.wikipedia.org/wiki/Javascript - Joel Spolsky também implicou essa definição em "Sua linguagem de programação pode fazer isso?" post sobre os benefícios da "programação funcional"
Chuck

Observe que, como normalmente escrito, o JavaScript não está usando seu segundo ponto, mas isso certamente não significa que não haja programadores fazendo exatamente isso e que a linguagem não suporta esse recurso, porque certamente o faz
johnbakers

@OpenLearner: Bem, sim, mas o mesmo acontece com Java e muitas outras linguagens que geralmente são consideradas estritamente imperativas - você pode escrevê-las em um estilo funcional, mas não é o caminho feliz da linguagem.
21313 Chuck

... mas o JS mais recente o suportaria.
Erik Reppen

3

Eu não acho que exista uma definição concreta de programação funcional, no entanto, muitas coisas que as pessoas consideram "programação funcional" podem ser feitas com javascript. Aqui está um bom exemplo breve neste artigo.


2

Para mim, o Javascript é uma linguagem imperativa e uma linguagem funcional, e você pode optar por usá-lo de qualquer maneira e até (por exemplo ) nos dois sentidos. Ou você pode optar por usar um paradigma e nunca tocar no outro. Você decide. Eu, como você, não acho que o Javascript deva ser chamado de Linguagem Funcional, porque permite entrar e sair do paradigma de programação funcional. Talvez se tivesse algum tipo de pragma, para limitar você usando apenas paradigmas de programação funcional, isso seria útil, eu acho. Mas, em resumo, eu digo que é mais uma linguagem imperativa / processual com alguns recursos de programação funcional lançados.


Por esse raciocínio, o F # não pode mais ser chamado de funcional.
Eric Mickelsen 18/10/10

1
Certo. Segundo a Wikipedia, F # é exatamente o que eu acabei de chamar de Javascript: "F # é uma [...] linguagem de programação multiparadigma que [...] abrange programação funcional e disciplinas de programação imperativa orientada a objetos"
Brian Onn

2

Costumo não pensar nas linguagens de programação como tendo um paradigma específico, mas que elas se prestam a certos paradigmas. No entanto, apenas porque eles se prestam a um paradigma específico, não significa que você precise usá-lo. É bem possível escrever programas orientados a objetos em C e escrever programas imperativos em ML. Não usar um certo paradigma para resolver um problema, porque a linguagem não foi projetada para isso, é apenas uma limitação artificial (é claro que você ainda deve levar em conta as limitações de uma linguagem ao decidir se uma solução específica será uma boa solução).


0

Bem, eu não diria que é programação funcional, mas então eu diria dizer que é orientada a objetos e apenas hoje um amigo disse que não iria colocá-lo na prateleira também.

Então, enquanto eu não diria que é, acho que há espaço para opinião. Ele possui características clássicas de programação funcional, não possui outras.


2
JavaScript é orientado a objetos. OO não requer classes, mas requer objetos.
Incognito

3
Javascript não é orientado a objetos, é baseado em protótipo.
Kris

1
JavaScript está programando sopa. Um pouco disso e um pouco daquilo.
Andrew S

0

Javascript é um ponto. Realmente depende de como você progride. Se eu codificasse de maneira OO, não seria OO? Portanto, se você apenas codificar as coisas de uma maneira 'funcional', seria funcional. Eu acho que é uma linguagem multiparadigma, então chamá-lo de apenas uma coisa não é totalmente exata.


0

@petraszd Eu reescrevi seu código um pouco para obter um "novo" para o 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]())
   })

Mas eu sei que esse caminho tem desvantagens para grandes loops ...

Pergunta relacionada sobre otimização da recorrência da cauda em JS

PS Postado aqui porque tem problema com a formatação do código ao postar como comentário


0

Em Javascript, você pode fazer algo assim !!

// 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
    })

Eu criei uma página no github para demonstrar esse conceito e você pode clonar / visualizar minha implementação


0

Como sabemos, a linguagem de programação funcional não permite alterar ou alterar os elementos (estado) das funções, mas em javascript é permitido nesse sentido não ser uma linguagem de programação funcional, embora trate a função como cidadãos de primeira classe.


-2

O que eu realmente odeio em javascript (se você tentar olhar para ele como linguagem FP) é o seguinte:

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

Você precisa entender o ambiente de pilha JS (não sei se é o termo certo) para entender esse comportamento.

No esquema, por exemplo, você simplesmente não pode produzir isso (Ok, ok - com a ajuda das referências dos idiomas subjacentes, você pode fazê-lo):

(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))

1
Hum, acho que o Javascript mantém referência à variável, mas não mantém referência ao valor .
Aerocode 04/10/12

1
A compreensão do escopo de variáveis ​​é fundamental para a programação eficaz em qualquer idioma. Javascript não está sozinho nisso.
rica Remer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.