Javascript est-il un langage de programmation fonctionnel?


135

Juste parce que les fonctions sont des objets de première classe, il y a des fermetures et des fonctions d'ordre supérieur, Javascript mérite-t-il d'être appelé un langage de programmation fonctionnelle? La principale chose que je pense qu'il manque, ce sont les fonctions pures, et cela ne `` ressemble '' pas à d'autres langages fonctionnels, comme lisp (bien que ce ne soit pas vraiment une bonne raison pour que ce ne soit pas une langue fonctionnelle ...)


12
@slashmais: Non! Cela l'empêche seulement d'être un pur langage (ly) fonctionnel. ML (au moins les dialectes modernes) sont également impurs - mais personne n'oserait les appeler non fonctionnels;)

4
Il existe de nombreux langages généralement considérés comme fonctionnels, mais qui ne sont pas purs. Je ne vois pas en quoi c'est une exigence. Si vous voulez être aussi strict, alors la plupart des langages dits POO ne sont pas non plus de POO. Vous vous retrouvez avec environ 95% de toutes les langues étant des langues sans paradigme.
jalf

6
Pourquoi est-ce important? Quand je code en C ++, je me fiche de savoir si le langage "est POO" ou non. Je tiens à ce qu'il ait certaines fonctionnalités de POO, et qu'il ait quelques fonctionnalités de programmation fonctionnelles, et beaucoup de fonctionnalités de programmation impératives, et beaucoup de fonctionnalités de programmation génériques. Mais que ce soit un langage POO ou un langage FP ou autre chose n'a pas d'importance. De même lorsque je code en JS, peu importe que ce soit FP ou non. Ce qui compte, c'est qu'il prend en charge de nombreuses fonctionnalités FP intéressantes. Il semble que ce ne soit pas la bonne question à poser.
jalf

3
@hvgotcodes: oui? Il n'y a absolument aucune règle disant que ce n'est pas le cas. Ma règle de base est que c'est un langage fonctionnel si vous pouvez l'utiliser pour programmer dans un style fonctionnel. Puisque Javascript a des fonctions, des fermetures et des lambdas de première classe, je pense que vous le pouvez, et en ce qui me concerne, c'est un langage fonctionnel. Pas pur, évidemment, mais la plupart des langages que nous considérons généralement FP (SML par exemple) ne le sont pas non plus. Alors vraiment, je pense que vous avez juste besoin de vous détendre. Si cela fait des contractions oculaires, vous devez consulter un médecin.
jalf

3
@jalf, absolument. La motivation de la question était que je voulais savoir ce que mes pairs et les gens plus intelligents que moi pensaient.
hvgotcodes

Réponses:


180

Répétant 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 qui prend en charge les fonctions de première classe et les lambdas, alors oui, JavaScript * est * un langage fonctionnel.

Si vous considérez également des facteurs tels que la prise en charge de l'immuabilité, les types de données algébriques, la correspondance de modèles, l'application partielle, etc., alors non, JavaScript * n'est pas * un langage fonctionnel.


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


29
+1 pour avoir souligné qu'il n'y a pas de définition universelle et avoir apporté quelques exemples de fonctionnalités archétypiques du langage fonctionnel que JS n'a pas.

1
Les versions ultérieures de l'implémentation de Mozilla de JavaScript (commençant par 1.7) ont une correspondance de modèle sous la forme d'affectations de déstructuration: developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeard4

JavaScript a la notion de partiels et applique partiellement des paramètres, donc je me demande si votre déclaration selon laquelle il ne prend pas en charge cela est incorrecte?
johnbakers

2
@OpenLearner, l'application partielle est supportée par à peu près toutes les langues auxquelles je peux penser, même C. Pour une certaine définition de "support" de toute façon. Le cas de JS n'est pas différent. Le point est de savoir si l'application partielle est sans effort et de première classe dans cette langue. Dans JS, ce n'est pas le cas. Si vous êtes curieux de savoir ce que je veux dire, jetez un œil à OCaml ou Haskell.
missingfaktor

JavaScript prend en charge l'afaik d'immuabilité.
fka

26

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

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


ouais, je suis d'accord que c'est un mélange et plusieurs choses différentes.
Ashley Grenon

5
mais cela ne répond pas à la question de savoir s'il est également fonctionnel. Être multi-paradigme implique de supporter plusieurs paradigmes. L'un de ces paradigmes est-il la programmation fonctionnelle?
jalf

15

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

La réponse à votre question à 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 de 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.


1
objectif de conception? Que voulez-vous dire? La dernière fois que j'ai vérifié, l'une de ses sources d'inspiration était Scheme. Je dirais qu'il est assez clair que l'un de ses objectifs de conception était de prendre en charge la programmation fonctionnelle ainsi qu'un tas d'autres paradigmes
jalf

2
Il prend en charge la programmation fonctionnelle autant que le C ++, si vous écrivez vous-même les bases appropriées - autant que vous pouvez émuler la syntaxe impérative dans, par exemple, Haskell avec un peu de travail. Néanmoins, la syntaxe de JavaScript conduit à penser à un flux de travail plutôt qu'à l'évaluation d'une fonction. Pour cette raison, moi (ou la plupart des programmeurs fonctionnels) considère que l'application du terme «fonctionnel» est trop étendue.
shuhalo

@ user411768: vous dites donc que la fonctionnalité ou non d'un langage dépend de la conception de sa bibliothèque standard? Je n'ai jamais entendu cette définition auparavant. Java possède la plupart des outils nécessaires pour programmer dans un style fonctionnel (fermetures et fonctions anonymes, par exemple), ce que C ++ (actuellement) n'a pas. Je pense que cela rend JS beaucoup plus FP que C ++. Le fait que le langage ne vous oblige pas à programmer dans un style FP ne le rend pas "moins fonctionnel", n'est-ce pas?
jalf

1
(i) La bibliothèque standard fait partie de la norme, tout comme les caractéristiques syntaxiques, et met l'accent sur un certain style idiomatique et conceptuel. Par exemple, "C ++ avec STL" est très différent de "C avec classes". Cela a un impact. (ii) JavaScript comporte une orientation objet, des fonctions citoyennes de première classe - les caractéristiques sont plutôt orthogonales à la dichotomie impérative / fonctionnelle. Cependant, il ne met pas en œuvre directement le curry, ni n'apporte de pureté, ni n'a jamais été destiné à cela. (iii) Mes derniers mots à ce sujet, voir le premier paragraphe du message.
shuhalo

3
L'affirmation selon laquelle JavaScript et C ++ offrent les mêmes commodités de programmation fonctionnelle est certainement erronée. JavaScript rend la programmation fonctionnelle assez directe et simple sans toutes les constructions désordonnées que vous devez utiliser en C ++ pour obtenir la même chose. Il y a beaucoup d'excellents codeurs C ++ qui disent
clairement

9

Le terme langage de «programmation fonctionnelle» est tellement surchargé de nos jours qu'il est presque inutile. Il y a deux significations dominantes:

  1. Possède des fonctions de première classe
    • Javascript est ça!
  2. Est basé sur des fonctions telles qu'utilisées dans le calcul lambda, en mettant l'accent sur le fait d'éviter un état mutable persistant (souvent en le remplaçant par des paramètres passés aux fonctions)
    • Comme couramment écrit, Javascript n'est pas cela à distance!

Choisissez votre sens et la question sera répondable.


Existe-t-il une source qui utilise la «programmation fonctionnelle» pour désigner les langages dont les fonctions sont des citoyens de premier ordre ?.
shuhalo

@ user411768: En fait, un autre répondant lié à l'article de Wikipedia, qui utilise cette définition. fr.wikipedia.org/wiki/Javascript - Joel Spolsky a également impliqué cette définition dans son "Est-ce que votre langage de programmation peut faire cela?" post sur les avantages de la "programmation fonctionnelle"
Chuck

Vous notez que, comme couramment écrit, JavaScript n'utilise pas votre deuxième point, mais cela ne signifie certainement pas qu'il n'y a pas de programmeurs qui font exactement cela, et que le langage ne prend pas en charge une telle fonctionnalité, car il le fait certainement
johnbakers

@OpenLearner: Eh bien, oui, mais il en va de même pour Java et de nombreux autres langages qui sont généralement considérés comme strictement impératifs - vous pouvez les écrire dans un style fonctionnel, mais ce n'est pas le chemin heureux du langage.
Chuck

... mais le dernier JS le prendrait en charge.
Erik Reppen

3

Je ne pense pas qu'il y ait une définition concrète de la programmation fonctionnelle, cependant beaucoup de choses que les gens considèrent comme «programmation fonctionnelle» peuvent être faites avec javascript. Voici un bon bref exemple dans cet article.


2

Pour moi, Javascript est à la fois un langage impératif et un langage fonctionnel, et vous pouvez choisir de l'utiliser dans les deux sens, et même ( egad ) dans les deux sens. Ou vous pouvez choisir d'utiliser un paradigme et ne jamais toucher l'autre. C'est à vous. Comme vous, je ne pense pas que Javascript doive être appelé un langage fonctionnel, car il vous permet d'entrer et de sortir du paradigme de la programmation fonctionnelle. Peut-être que s'il y avait un pragma quelconque, pour vous limiter à n'utiliser que des paradigmes de programmation fonctionnelle, 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 fonctionnelle ajoutées.


Par ce raisonnement, F # ne peut plus être appelé fonctionnel.
Eric Mickelsen

1
Droite. Selon Wikipedia, F # est exactement ce que je viens d'appeler Javascript: "F # [...] est un langage de programmation multi-paradigme [...] qui englobe la programmation fonctionnelle ainsi que les disciplines de programmation orientées objet impératives"
Brian Onn

2

J'ai tendance à ne pas penser aux langages de programmation comme ayant 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 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 pour cela, c'est simplement vous limiter artificiellement (bien sûr, vous devez toujours prendre en compte les limites d'une langue lorsque vous décidez si une solution particulière sera une bonne solution).


0

Eh bien, je ne dirais pas que c'est de la programmation fonctionnelle, mais alors je dirais que c'est orienté objet et aujourd'hui, un ami 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 place pour l'opinion. Il a des caractéristiques classiques de la programmation fonctionnelle, il n'en a pas d'autres.


2
JavaScript est orienté objet. OO ne nécessite pas de classes, il nécessite cependant des objets.
Incognito

3
Javascript n'est pas orienté objet, il est basé sur un prototype.
Kris

1
JavaScript programme la soupe. Un peu de ceci et un peu de cela.
Andrew S

0

Javascript est à un point. Cela dépend vraiment de la façon dont vous le programmez. Si je code de manière OO, ne serait-ce pas OO? Donc, si vous codez simplement les choses d'une manière «fonctionnelle», ce serait fonctionnel. Je suppose que c'est un langage multi-paradigme, donc l'appeler juste une chose n'est pas tout à fait exact.


0

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

   
   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 manière a des inconvénients pour les grosses boucles ...

Question connexe sur l'optimisation de la récurrence de la queue dans JS

PS Publié ici parce que j'ai un problème avec le formatage du code lors de la publication en tant que commentaire


0

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 créé une page github afin de faire une démonstration de ce concept et vous pouvez cloner / visualiser mon implémentation


0

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 qu'il ne s'agit pas d'un langage de programmation fonctionnel, bien qu'il traite la fonction comme des citoyens de première classe.


-2

Ce que je déteste vraiment en javascript (si vous essayez de le considérer comme un langage FP), c'est ceci:

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

Vous devez comprendre l'environnement de la pile JS (je ne sais pas si c'est le bon terme) pour comprendre un tel comportement.

Dans le schéma par exemple, vous ne pouvez tout simplement pas produire une telle chose (Ok, ok - avec l'aide des références des langues sous-jacentes, vous pouvez le faire):

(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
Hm, je pense que Javascript fait référence à la variable mais ne fait pas référence à la valeur .
aeracode

1
Comprendre la portée des variables est essentiel pour une programmation efficace dans n'importe quel langage. Javascript n'est pas seul dans ce domaine.
riche remer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.