web-dev-qa-db-fra.com

Javascript est-il un langage de programmation fonctionnel

  • Javascript est-il un langage fonctionnel? Je sais qu'il a des objets et vous pouvez le faire OOP avec lui aussi, mais est-ce aussi un langage fonctionnel, peut-il être utilisé de cette façon?
  • Vous savez comment OOP est devenu/semble être la prochaine évolution de la programmation, cela signifie-t-il que la `` programmation fonctionnelle '' est la prochaine évolution (Remarque: ce n'est PAS une invite pour l'opinion MAIS une invite pour une réponse factuelle basée sur des preuves, et cette note s'adresse plus aux modérateurs qu'aux contributeurs;)).
  • J'apprends mieux à travers des exemples, peut-être que quelqu'un pourrait montrer effectuer la même tâche d'une manière OOP puis d'une programmation fonctionnelle pour moi-même pour comprendre et comparer ce que la programmation fonctionnelle fait/est).

Pour être honnête, je ne comprends pas vraiment complètement la "programmation fonctionnelle": P Donc, comparer Javascript avec la programmation fonctionnelle peut être totalement incorrect.

Pour mettre la programmation fonctionnelle en termes simples: est-ce simplement le bénéfice de l'abstration GRÂCE à l'utilisation de fonctions anonymes?

Ou est-ce trop simple? D'une manière simple, OOP est l'avantage de l'abstraction à travers des objets, mais je pense que c'est un peu trop simpliste pour décrire la POO.

Est-ce un bon exemple de programmation fonctionnelle? ...

Javascript OOP Exemple:

// sum some numbers
function Number( v )
{ 
  this.val = v;
}

Number.prototype.add( /*Number*/ n2 )
{
    this.val += n2.val;
}

Exemple de programmation fonctionnelle:

function forEach(array, action) 
{
   for (var i = 0; i < array.length; i++)
       action(array[i]);
}  

function add(array)
{
    var i=0;
    forEach(array, function(n)
    {
        i += n;
    });
    return i;
}

var res = add([1,9]);
35
Marek

Javascript est-il un langage fonctionnel? Je sais qu'il a des objets et vous pouvez le faire OOP avec lui aussi, mais est-ce aussi un langage fonctionnel, peut-il être utilisé de cette façon?

Parfois, les gens diront la programmation fonctionnelle, quand ils veulent dire programmation impérative ou programmation procédurale . À proprement parler, programmation fonctionnelle est:

En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite le calcul comme l'évaluation des fonctions mathématiques et évite les données d'état et mutables . Il met l'accent sur l'application des fonctions, contrairement au style de programmation impératif, qui met l'accent sur les changements d'état. La programmation fonctionnelle a ses racines dans le lambda calcul, un système formel développé dans les années 1930 pour étudier la définition de fonction, l'application de fonction et la récursivité. De nombreux langages de programmation fonctionnels peuvent être considérés comme des élaborations du calcul lambda.

Bien que Javascript ne soit pas largement connu ou utilisé comme langage fonctionnel, il a quelques éléments fonctionnels :

JavaScript a beaucoup en commun avec Scheme. C'est un langage dynamique. Il a un type de données flexible (tableaux) qui peut facilement simuler des expressions s. Et surtout, les fonctions sont des lambdas.

Scheme est un dialecte de LISP , et probablement l'un des langages auxquels la plupart des programmeurs pensent lorsqu'ils discutent de programmation fonctionnelle. En ce qui concerne orientation objet , Javascript est un langage orienté objet. Mais son orientation d'objet est basée sur un prototype :

La programmation basée sur des prototypes est un style de programmation orientée objet dans lequel les classes ne sont pas présentes et la réutilisation des comportements (connue sous le nom d'héritage dans les langages basés sur les classes) est effectuée via un processus de clonage d'objets existants qui servent de prototypes. Ce modèle peut également être appelé programmation sans classe, orientée prototype ou basée sur une instance. La délégation est la fonctionnalité de langage qui prend en charge la programmation basée sur des prototypes.

Ainsi, bien que Javascript soit orienté objet, il ne suit pas le plus courant modèle basé sur une classe , tout comme les langages comme C++, C #, Java et PHP (et pas mal d'autres) Et bien sûr c'est aussi un langage impératif, ce qui conduit à la confusion avec la programmation fonctionnelle que j'ai décrite plus haut.

Vous savez comment OOP est devenu/semble être la prochaine évolution de la programmation, cela signifie-t-il que la "programmation fonctionnelle" est la prochaine évolution

L'orientation des objets et la programmation fonctionnelle ne sont que deux des nombreux différents paradigmes de programmation , ce sont des styles de programmation différents avec des concepts et des abstractions différents. Le mot clé est "différent". Il n'y a pas un seul paradigme qui soit meilleur que d'autres ou plus évolué que d'autres, chacun s'adapte mieux à certains scénarios que les autres. Certains peuvent être beaucoup plus anciens que d'autres, mais en termes d'évolution, cela les rend meilleurs, car ils ont survécu plus longtemps. Mais ce n'est pas une façon très intelligente de voir les choses.

Javascript, comme je l'ai décrit ci-dessus et comme plusieurs autres langues, est multi-paradigme. Il vous permet d'écrire du code dans un style impératif, orienté objet et fonctionnel. C'est à vous de choisir celui qui correspond le mieux à ce que vous construisez. Il existe également plusieurs langages de paradigme unique, l'exemple canonique étant Java, qui ne permet que la programmation orientée objet basée sur les classes1.

Vous devriez vraiment résister à toute envie de traiter les langues et les paradigmes comme des déclarations de mode. Il y a une abondance de conneries là-bas, principalement écrites par des fanboys/fangirls ou des gens du marketing, avec peu (voire aucune) connaissance et compréhension de la programmation. Des termes comme "mieux", "plus évolué", etc., ne s'appliquent tout simplement pas.

J'apprends mieux à travers des exemples, peut-être que quelqu'un pourrait montrer l'exécution de la même tâche d'une manière OOP puis d'une programmation fonctionnelle pour moi-même pour comprendre et comparer ce que la programmation fonctionnelle fait/est.

Ce serait une terrible façon d'apprendre. L'orientation fonctionnelle et celle des objets sont des styles très différents, et tout autre exemple que des exemples terriblement simples ne conviendrait ni à l'un ni à l'autre.

1 Mais dernièrement, essaie d'étendre sa portée à la programmation générique, voyons comment cela se passe.


En conclusion:

  • Concentrez-vous sur l'apprentissage de Javascript, c'est un langage magnifique et extrêmement utile. Apprenez la langue, pas le battage médiatique.
  • Plusieurs paradigmes différents, tous également utiles. A vous de choisir celui que vous préférez et celui qui vous convient le mieux quel que soit votre projet.
  • Si vous voulez apprendre la programmation fonctionnelle, choisissez un langage plus adapté, comme Scheme ou Clojure . Mais vous devrez d'abord comprendre les concepts mathématiques impliqués.
  • Faites des recherches avant de demander. La plupart de vos questions sont traitées par les articles Wikipédia pertinents. Savoir rechercher et demander est une compétence extrêmement importante pour tout programmeur.
73
yannis

Javascript peut être utilisé comme langage fonctionnel, en fait il le fait assez bien. Il est possible d'implémenter monads prend en charge une construction lambda, etc. Ce n'est pas exclusivement un langage fonctionnel dans la mesure où il possède également de nombreuses fonctionnalités orientées objet, mais il peut être utilisé de cette façon. En fait, je trouve que l'utilisation de Javascript comme langage fonctionnel est un excellent moyen de l'utiliser. (Exemple jQuery et underscore.js)

8
Zachary K

L'évolution signifie normalement un changement incrémentiel . OOP n'est pas un ajout incrémentiel à la programmation procédurale - en fait, il est entièrement orthogonal à un modèle de programmation sous-jacent et peut être combiné avec n'importe lequel d'entre eux. La programmation fonctionnelle n'est pas un ajout incrémentiel à la procédure procédurale , OOP ou autre chose - c'est une base alternative pour exprimer les principes informatiques fondamentaux, et c'est en fait la première telle base jamais formulée, bien avant l'apparition des premiers ordinateurs. Il est important de comprendre que tous ces systèmes fondamentaux sont équivalents (c'est-à-dire que l'on peut s'exprimer en termes d'un autre).

Afin de comprendre l'approche fonctionnelle, vous devrez d'abord obtenir mathématiques de base . Si vous voulez avoir une idée de ce que cela signifie de coder dans un style fonctionnel en Javascript, commencez à utiliser jQuery .

6
SK-logic

Javascript est d'abord un prototype, avec des capacités fonctionnelles - accordées par son utilisation des fonctions comme objets de première classe.

Cela signifie que vous pouvez utiliser des fonctions en tant que données, ce qui a l'étrange effet de réduire le besoin de variables qui maintiennent l'état. Si vous trouvez que vous atteignez l'instruction var ou utilisez une ou plusieurs instructions "if", vous vous éloignez d'un style fonctionnel.

Une autre particularité notable du style fonctionnel est que les fonctions doivent renvoyer UNIQUEMENT le résultat de leur évaluation et n'avoir aucun effet secondaire sur l'état en dehors de leur portée:

// oops, this is producing a side effect
function sideEffecter(){//theres no input...        
    window.thingy = 'foo';
    // hey, this isn't returning anything!!!
} 

Les langages fonctionnels sont non destructifs - ce qui signifie qu'ils ne modifient pas l'entrée, mais renvoient plutôt des données entièrement nouvelles basées sur l'entrée. Voir ce fil: https://stackoverflow.com/questions/749084/jquery-map-vs-each

Les langages fonctionnels présentent également de nombreuses méthodes en commun - avec des noms comme "map", "fold", "réduire" qui traitent les listes/collections. Dans JS, contrairement à d'autres langages, nous devons les activer manuellement - voir des bibliothèques comme underscore.js pour quelques exemples, bien que la dernière implémentation de JS ait certains d'entre eux sortent de la boîte.

La chose importante à garder à l'esprit (IMO) est que bien que JS puisse utiliser les modèles fonctionnels certains, il n'est pas toujours bien équipé pour s'exécuter.

Prenez l'itération sur un tableau, par exemple. Vous pouvez le faire en utilisant un style fonctionnel ou les constructions de boucles natives - et de manière générale, la boucle est plus performante. Prenez cet exemple - frappez-le avec des boucles de taille croissante et enregistrez les temps d'exécution dans différents navigateurs (je l'ai déjà fait, mais j'ai perdu les repères - désolé!):

var test = ['foo', 'bar', 'baz'], removeFunc, removeLoop;

//(semi)functional style...
// to be really functional each condition in the ternary would be another function
removeFunc = function(src, trg) {
    return src.length === 0 ? 
        src : 
            src[0] === trg ? 
                src.slice(1) : 
                    [src[0]].concat(removeFunc(src.slice(1), trg));
};

//but this is faster
removeLoop = function(src, trg){
    var len = src.length, // using variables to represent state...
        i=0, 
        result = [];        
    while(i < n){
       if(src[i] !== trg){
          result.Push(src[i]);
       }
       i = i+1;
    }
}

De plus, si vous utilisez une construction fonctionnelle pour frapper des boucles de taille considérable et n'utilisez pas une forme de gestion de pile ad hoc, vous pouvez inonder la pile (bien que, pour être honnête, vous ayez besoin d'une GRANDE liste pour que cela se produise. ..). Vous devez également prendre en compte le mélange des optimisations de variantes dans chaque navigateur - bien que si vous travaillez dans un environnement Node.js, il s'agit évidemment davantage d'une cible fixe.

Cela ne veut pas dire que vous ne devriez pas utiliser de constructions fonctionnelles en Javascript - soyez simplement conscient des limites de son implémentation par rapport à son environnement.

Voici quelques liens qui pourraient vous intéresser:

n bon chapitre sur la programmation fonctionnelle en Javascript de l'excellent "Eloquent Javascript"

Le petit intrigant

n de mes amis a écrit une bibliothèque JS basée sur le Little Schemer

n bon tutoriel sur Scheme qui pourrait vous aider à mieux comprendre FP

2
sunwukung

Non.

JavaScript est avant tout un langage orienté objet.

Cela ne veut pas dire que vous ne pouvez pas écrire de programmes JavaScript dans un style fonctionnel, car vous pouvez adopter un style fonctionnel dans any Turing un langage complet si vous essayez assez fort. Vous pouvez faire de la programmation fonctionnelle en assembleur si vous le souhaitez. Mais cela ne fait pas rendre chaque langue fonctionnelle. Vous pourriez aussi bien appeler Haskell impératif, ou Java un langage de programmation logique - si vous aviez adopté cette approche, les termes deviendraient bientôt sans signification.

L'OMI la manière de classer une langue dans le paradigme approprié est de considérer:

  • Quel est le style dominant activé par les constructions de langage (clairement OOP pour JavaScript, les langages fonctionnels mettent plutôt l'accent sur les fonctions et les valeurs de données immuables)
  • Quel paradigme est pris en charge dans les bibliothèques de base du langage (encore une fois clairement OOP pour JavaScript)
  • Quelles fonctionnalités sont désactivées ou découragées dans le langage (les langages fonctionnels découragent ou interdisent les variables mutables, ce qui n'est pas le cas pour JavaScript)
  • Quel style de développement est répandu dans la communauté des développeurs utilisant le langage (encore une fois, OOP est clairement répandu dans le monde JavaScript)

Personnellement, je trouve plutôt amusant que beaucoup de gens aiment prétendre qu'une langue est "fonctionnelle" juste parce que c'est un terme à la mode en ce moment :-)

Si vous voulez une perspective un peu longue mais divertissante sur les paradigmes de programmation à travers les années, ça vaut le coup de regarder Vidéo de l'oncle Bob Martin "The Last Programming Language" . Pour moi, le grand aperçu de cet exposé était que les paradigmes de programmation sont définis par quelles fonctionnalités ils enlèvent, pas quelles fonctionnalités ils mettent en ......

2
mikera