web-dev-qa-db-fra.com

Javascript est-il un langage de programmation fonctionnel?

Parce que les fonctions sont des objets de première classe, qu'il existe des fermetures et des fonctions d'ordre supérieur, Javascript mérite-t-il d'être appelé langage de programmation fonctionnelle? La principale chose qui me manque, ce sont les fonctions pures, et il ne se sent pas comme les autres langages fonctionnels, comme le LISP (bien que ce ne soit pas vraiment une bonne raison pour que ce ne soit pas un langage fonctionnel ...)

130
hvgotcodes

Répéter ma propre réponse à une question similaire,

Il n'y a pas de définition acceptée du langage de programmation fonctionnel.

Si vous définissez le langage fonctionnel comme le langage prenant en charge les fonctions de première classe et les lambdas, alors oui, JavaScript * est * un langage fonctionnel.

Si vous tenez également compte de facteurs tels que la prise en charge de l'immutabilité, les types de données algébriques, la correspondance de modèles, les applications partielles, etc., non, JavaScript * n'est pas * un langage fonctionnel.


Je vous encourage à lire les articles de blog suivants (et les commentaires ci-dessous):

174
missingfaktor

Je dirais que c'est un langage multi-paradigme.

EDIT: C'est multi-paradigme et comprend des constructions fonctionnelles.

26
Niki Yoshiuchi

si vous étirez et tordez le terme "programmation fonctionnelle" au point de discussions philosophiques, cette question sera peut-être à nouveau ouverte. Cependant, vous vous retrouvez alors au niveau de questions utiles telles que "C++ est-il vraiment un langage de programmation"?

La réponse à votre question sur un niveau plus quotidien est "non".

La programmation fonctionnelle signifie que le programme est conceptualisé comme une évaluation d’une fonction plutôt que comme un flux de contrôle. Le code est une description des fonctions et n'a pas de concept inhérent de flux de contrôle.

JavaScript a un flux de contrôle et est conceptualisé comme un langage impératif. De par son objectif de conception, ce n’est clairement pas un langage fonctionnel.

15
shuhalo

Le terme "programmation fonctionnelle" est tellement surchargé qu’il est presque inutile de nos jours. Il y a deux significations dominantes:

  1. A des fonctions de première classe
    • Javascript est-ce!
  2. Est basé sur les fonctions utilisées dans le calcul lambda, avec un accent mis sur l’évitement de l’état mutable persistant (le remplaçant souvent par des paramètres passés aux fonctions)
    • Comme il est couramment écrit, Javascript n’est pas à distance!

Choisissez votre signification et ensuite la question est répondable.

8
Chuck

Je ne pense pas qu'il existe une définition concrète de la programmation fonctionnelle, mais beaucoup de choses que les gens considèrent comme une "programmation fonctionnelle" peuvent être faites avec JavaScript. Voici un bon exemple dans ce article.

3
marknery

Pour moi, le langage Javascript est à la fois un langage impératif et un langage fonctionnel. Vous pouvez choisir de l’utiliser de toute façon, et même (egad) dans les deux sens. Ou vous pouvez choisir d’utiliser un paradigme et de ne jamais toucher l’autre. C'est à vous. Comme vous, je ne pense pas que Javascript devrait être appelé un langage fonctionnel, car il vous permet de vous promener dans le paradigme de la programmation fonctionnelle. Peut-être que si cela avait un pragma quelconque, de vous limiter en utilisant uniquement des paradigmes de programmation fonctionnels, alors ce serait utile, je pense. Mais, en résumé, je dis que c’est plus un langage impératif/procédural avec quelques fonctionnalités de programmation fonctionnelles ajoutées.

2
Brian Onn

J'ai tendance à ne pas penser que les langages de programmation ont un paradigme particulier, mais qu'ils se prêtent à certains paradigmes. Cependant, ce n'est pas parce qu'ils se prêtent à un paradigme particulier que vous devez utiliser ce paradigme. Il est tout à fait possible d'écrire des programmes orientés objet en C et d'écrire des programmes impératifs en ML. Ne pas utiliser un certain paradigme pour résoudre un problème parce que le langage n'est pas conçu, c'est simplement vous limiter artificiellement (vous devez bien sûr toujours prendre en compte les limitations d'un langage pour décider si une solution particulière sera une bonne solution).

2
David Brown

Eh bien, je ne dirais pas que c'est de la programmation fonctionnelle, mais ensuite je dirais que c'est orienté objet et qu'un ami aujourd'hui a dit qu'il ne le mettrait pas non plus sur cette étagère.

Donc, même si je ne dirais pas que c'est le cas, je suppose qu'il y a matière à opinion. Il a des caractéristiques classiques de la programmation fonctionnelle, il n'en a pas d'autres.

0
slezica

En Javascript, vous pouvez faire quelque chose comme ça !!

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

J'ai fait un github page afin de démontrer ce concept et vous pouvez cloner/voir ma mise en oeuvre

0
Wayne Chiu

Javascript est à un point. Cela dépend vraiment de la façon dont vous allez la programmer. Si je code de manière OO, ne seriez-vous pas OO? Donc, si vous codez simplement les choses de manière "fonctionnelle", ce serait fonctionnel. Je suppose que c'est un langage multi-paradigme Appelez cela, une chose n'est pas tout à fait exacte.

0
user372743

Comme nous le savons, le langage de programmation fonctionnel ne permet pas de changer ou de muter les éléments (état) des fonctions, mais en javascript, il est autorisé. En ce sens, ce n'est pas un langage de programmation fonctionnel, même s'il traite les fonctions comme des citoyens de première classe.

0
Sourabh Ranka

@petraszd Je réécris un peu votre code pour obtenir un "nouvel" opérateur pour :

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

Mais je sais que cette façon de faire a des inconvénients pour les grandes boucles ...

Question connexe sur l'optimisation de la recurtion de la queue dans JS

P.S. Posté ici parce que le format du code pose un problème lors de la publication d'un commentaire

0
aeracode