Maison > interface Web > js tutoriel > Qu'est-ce que la programmation fonctionnelle?

Qu'est-ce que la programmation fonctionnelle?

William Shakespeare
Libérer: 2025-02-10 11:08:08
original
628 Les gens l'ont consulté

What Is Functional Programming?

Points de base

  • La programmation fonctionnelle est un paradigme de programmation qui met l'accent sur l'invariance, les fonctions de première classe, la transparence de la citation et les fonctions pures. Il aide à écrire un code élégant, maintenable, évolutif et prévisible.
  • Les principes principaux de la programmation fonctionnelle incluent des fonctions pures (fonctions sans effets secondaires ou opérations qui ne sont pas liés à la sortie de la fonction), l'invariance (aucune modification directe des données), les fonctions de première classe (les fonctions peuvent être utilisées comme n'importe quelle autre valeur ) et une fonction d'ordre élevé (une fonction qui prend une fonction comme un ou plusieurs de ses paramètres, ou une fonction qui renvoie une fonction).
  • La programmation fonctionnelle génère du code modulaire, qui est plus facile à déboguer et à tester. Étant donné que les appels de fonction peuvent être distribués sur plusieurs noyaux, il peut également améliorer l'efficacité de calcul.
  • Le principe de programmation fonctionnelle peut être incorporé dans n'importe quel langage de programmation et utilisé en conjonction avec d'autres styles de programmation tels que la programmation orientée objet. Même s'ils ne sont pas purement utilisés, ils peuvent produire des résultats positifs dans le code.

En tant que programmeur, vous voudrez peut-être écrire un code élégant, maintenable, évolutif et prévisible. Les principes de la programmation fonctionnelle (FP) peuvent grandement aider à atteindre ces objectifs.

La programmation fonctionnelle est un paradigme ou un style qui met l'accent sur l'invariance, les fonctions de première classe, la transparence de la citation et les fonctions pures. Si vous ne comprenez pas le sens de ces mots, ne vous inquiétez pas! Nous décomposons tous ces termes dans cet article.

La programmation fonctionnelle provenait du calcul λ, un système mathématique qui tourne autour de l'abstraction et de la généralisation de la fonction. Par conséquent, de nombreux langages de programmation fonctionnelle semblent très mathématiques. Mais la bonne nouvelle est: vous n'avez pas besoin d'utiliser un langage de programmation fonctionnel pour appliquer les principes de programmation fonctionnelle à votre code. Dans cet article, nous utiliserons JavaScript, qui possède de nombreuses fonctionnalités qui le rendent adapté à la programmation fonctionnelle sans être limité à ce paradigme.

Principes principaux de la programmation fonctionnelle

Maintenant que nous avons discuté de la programmation fonctionnelle, parlons des principes principaux derrière FP.

Fonction pure

J'aime considérer les fonctions comme des machines - elles acceptent l'entrée ou les paramètres, puis publient quelque chose, c'est-à-dire des valeurs de retour. Les fonctions pures n'ont pas de «effets secondaires» ou d'opérations indépendantes de la sortie de la fonction. Certains effets secondaires potentiels incluent l'impression des valeurs ou les enregistrer avec console.log, ou la manipulation de variables en dehors de la fonction.

Ceci est un exemple de fonction non pure:

let number = 2;

function squareNumber() {
  number = number * number; // 非纯操作:操作函数外部的变量
  console.log(number); // 非纯操作:控制台记录值
  return number;
}

squareNumber();
Copier après la connexion
Copier après la connexion
Copier après la connexion

La fonction suivante est une fonction pure. Il accepte l'entrée et produit la sortie.

let number = 2;

function squareNumber() {
  number = number * number; // 非纯操作:操作函数外部的变量
  console.log(number); // 非纯操作:控制台记录值
  return number;
}

squareNumber();
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les fonctions pures s'exécutent indépendamment de l'état en dehors de la fonction, elles ne devraient donc pas dépendre de l'état global ou des variables en dehors d'elles-mêmes. Dans le premier exemple, nous utilisons la variable number créée à l'extérieur de la fonction et la définissons à l'intérieur de la fonction. Cela viole ce principe. Si vous comptez fortement sur la modification des variables mondiales, votre code sera imprévisible et difficile à suivre. Il sera plus difficile de savoir où l'erreur s'est produite et pourquoi la valeur change. Au lieu de cela, le débogage est plus facile avec uniquement des variables locales d'entrée, de sortie et de fonction.

De plus, les fonctions doivent suivre la transparence de référence , ce qui signifie que compte tenu d'une entrée, leur sortie sera toujours la même. Dans l'exemple ci-dessus, si je passe 2 à la fonction, il reviendra toujours 4. Ce n'est pas le cas avec les appels d'API ou la génération de nombres aléatoires, ce ne sont que deux exemples. Compte tenu de la même entrée, la sortie peut ou non être renvoyée.

// 纯函数
function squareNumber(number) {
  return number * number;
}

squareNumber(2);
Copier après la connexion
Copier après la connexion

Invariance

La programmation fonctionnelle priorise également invariabilité , c'est-à-dire qu'aucune donnée n'est modifiée directement. L'invariance apporte une prévisibilité - vous connaissez la valeur des données, et elles ne changeront pas. Il rend le code simple, testable et fonctionne sur des systèmes distribués et multithreads.

L'invariance joue souvent un rôle lorsque nous travaillons avec des structures de données. De nombreuses méthodes de tableau dans JavaScript modifient directement les tableaux. Par exemple, .pop() supprime un élément directement de la fin du tableau, tandis que .splice() vous permet d'obtenir une partie du tableau. Au lieu de cela, dans le paradigme fonctionnel, nous copierons le tableau et supprimerons les éléments que nous voulons éliminer dans le processus.

// 不具有引用透明性
Math.random();
// 0.1406399143589343
Math.random();
// 0.26768924082159495
Copier après la connexion
// 我们直接修改 myArr
const myArr = [1, 2, 3];
myArr.pop();
// [1, 2]
Copier après la connexion

Fonction de première classe

Dans la programmation fonctionnelle, nos fonctions sont des fonctions de première classe, ce qui signifie que nous pouvons les utiliser comme n'importe quelle autre valeur. Nous pouvons créer des tableaux de fonctions, les transmettre comme arguments à d'autres fonctions et les stocker en variables.

// 我们复制数组而不包含最后一个元素,并将其存储到变量中
let myArr = [1, 2, 3];
let myNewArr = myArr.slice(0, 2);
// [1, 2]
console.log(myArr);
Copier après la connexion

Fonctions d'ordre avancé

Les fonctions d'ordre supérieur sont des fonctions qui effectuent l'une des deux opérations: elles prennent la fonction comme un ou plusieurs de ses paramètres ou renvoient la fonction. JavaScript a intégré de nombreuses fonctions d'ordre supérieur de première classe - telles que map, reduce et filter, nous pouvons les utiliser pour interagir avec les tableaux.

filter est utilisé pour renvoyer un nouveau tableau de l'ancien tableau qui ne contient que des valeurs qui remplissent les conditions que nous fournissons.

let myFunctionArr = [() => 1 + 2, () => console.log("hi"), x => 3 * x];
myFunctionArr[2](2); // 6

const myFunction = anotherFunction => anotherFunction(20);
const secondFunction = x => x * 10;
myFunction(secondFunction); // 200
Copier après la connexion

map est habitué à parcourir les éléments dans le tableau et à modifier chaque élément en fonction de la logique fournie. Dans l'exemple suivant, nous doublez chaque élément du tableau en passant une fonction qui multiplie notre valeur de 2 à map.

const myArr = [1, 2, 3, 4, 5];

const evens = myArr.filter(x => x % 2 === 0); // [2, 4]
Copier après la connexion

reduce nous permet de produire une seule valeur en fonction du tableau d'entrée - il est généralement utilisé pour résumer, aplatir les tableaux ou les valeurs de groupe d'une manière ou d'une autre.

const myArr = [1, 2, 3, 4, 5];

const doubled = myArr.map(i => i * 2); // [2, 4, 6, 8, 10]
Copier après la connexion

Vous pouvez également implémenter ces fonctions vous-même! Par exemple, vous pouvez créer une fonction filter comme ceci:

const myArr = [1, 2, 3, 4, 5];

const sum = myArr.reduce((i, runningSum) => i + runningSum); // 15
Copier après la connexion

Le deuxième type de fonctions d'ordre supérieur (fonctions qui renvoie d'autres fonctions) est également un modèle relativement fréquent. Par exemple:

let number = 2;

function squareNumber() {
  number = number * number; // 非纯操作:操作函数外部的变量
  console.log(number); // 非纯操作:控制台记录值
  return number;
}

squareNumber();
Copier après la connexion
Copier après la connexion
Copier après la connexion

Vous pouvez également être intéressé par le curry, vous pouvez donc le lire!

combinaison de fonctions

La combinaison de fonction

consiste à combiner plusieurs fonctions simples pour créer des fonctions plus complexes. Vous pouvez donc avoir une fonction averageArray qui combine la fonction moyenne avec la fonction de somme qui résume les valeurs du tableau. Les fonctions individuelles sont petites et peuvent être répétées à d'autres fins et combinées ensemble pour effectuer un travail plus complet.

// 纯函数
function squareNumber(number) {
  return number * number;
}

squareNumber(2);
Copier après la connexion
Copier après la connexion

Avantages

La programmation fonctionnelle génère du code modulaire. Vous avez un petit nombre de fonctions que vous pouvez utiliser à plusieurs reprises. Comprendre les fonctions spécifiques de chaque fonction signifie qu'elle doit être simple pour identifier les erreurs et les tests d'écriture, surtout si la sortie de la fonction doit être prévisible.

De plus, si vous essayez d'utiliser plusieurs cœurs, vous pouvez distribuer des appels de fonction à ces cœurs, afin qu'il puisse améliorer l'efficacité de calcul.

Comment utiliser la programmation fonctionnelle?

Vous n'avez pas besoin de vous tourner complètement en programmation fonctionnelle pour intégrer toutes ces idées. Vous pouvez même bien utiliser beaucoup d'idées avec la programmation orientée objet, qui sont souvent considérées comme leur rival.

Par exemple, React intègre de nombreux principes fonctionnels, tels que les états immuables, mais utilise principalement la syntaxe de classe pendant de nombreuses années. Il peut également être mis en œuvre dans presque tous les langues de programmation - vous n'avez pas besoin d'écrire Clojure ou Haskell à moins que vous ne le vouliez vraiment.

Même si vous n'êtes pas un puriste, les principes de programmation fonctionnelle peuvent produire des résultats positifs dans votre code.

Des questions fréquemment posées sur la programmation fonctionnelle

Quels sont les principes clés de la programmation fonctionnelle?

La programmation fonctionnelle est basée sur certains principes clés. Le premier est l'invariance, ce qui signifie qu'une fois qu'une variable est définie, elle ne peut pas être modifiée. Cela élimine les effets secondaires et rend le code plus facile à comprendre. Le deuxième principe est les fonctions pures, ce qui signifie que la sortie d'une fonction n'est déterminée que par son entrée, sans aucune entrée ni sortie masquée. Le troisième principe est les fonctions de première classe, ce qui signifie que les fonctions peuvent être utilisées comme entrée ou sortie vers d'autres fonctions. Cela permet des fonctions d'ordre supérieur et rend le code plus concis et plus facile à comprendre.

Quelle est la différence entre la programmation fonctionnelle et la programmation procédurale?

La principale différence entre la programmation fonctionnelle et procédurale est la façon dont ils traitent les données et l'état. Dans la programmation procédurale, les états de programme sont stockés en variables et peuvent être modifiés au fil du temps. Dans la programmation fonctionnelle, l'état ne change pas, mais crée un nouvel état à partir de l'état existant. Cela rend la programmation fonctionnelle plus facile à prévoir et à déboguer car il n'y a pas d'effets secondaires à craindre.

Quels sont les avantages de la programmation fonctionnelle?

La programmation fonctionnelle offre de nombreux avantages. Il peut rendre le code plus facile à lire et à comprendre car il évite les effets secondaires et les états mutables. Il rend également le code plus fiable, car il encourage l'utilisation de fonctions pures qui produisent toujours la même sortie pour la même entrée. De plus, la programmation fonctionnelle peut rendre le code plus facile à tester et à déboguer car les fonctions peuvent être testées isolément.

Quels sont les défis de la programmation fonctionnelle?

Bien que la programmation fonctionnelle présente de nombreux avantages, il a également certains défis. Il peut être difficile à apprendre, en particulier pour les personnes habituées à la programmation procédurale ou orientée objet. La mise en œuvre de certains algorithmes dans le style fonctionnel peut également être plus difficile. De plus, la programmation fonctionnelle conduit parfois à un code moins efficace, car il implique souvent de créer de nouveaux objets plutôt que de modifier les objets existants.

Quels langages prennent en charge la programmation fonctionnelle?

De nombreux langages de programmation prennent en charge la programmation fonctionnelle dans une certaine mesure. Certains langages, tels que Haskell et Erlang, sont purement fonctionnels, tandis que d'autres, tels que JavaScript et Python, sont des langages multi-paradigmes qui prennent en charge la programmation fonctionnelle et d'autres paradigmes. Même les langages traditionnellement sans rapport avec la programmation fonctionnelle, tels que Java et C, ont ajouté des fonctionnalités pour soutenir la programmation fonctionnelle ces dernières années.

Comment gérer les effets secondaires dans la programmation fonctionnelle?

Dans la programmation fonctionnelle, évitez autant que possible les effets secondaires. Cela se fait en utilisant des fonctions pures qui ne modifient aucun état ou ne font aucune opération d'E / S. Lorsque des effets secondaires sont nécessaires, ils sont isolés et contrôlés. Par exemple, dans Haskell, les effets secondaires sont traités avec des monades, qui encapsulent les effets secondaires et fournissent un moyen de les relier ensemble de manière contrôlée.

Quelles sont les fonctions d'ordre supérieur dans la programmation fonctionnelle?

Une fonction d'ordre supérieur est une fonction qui prend une ou plusieurs fonctions comme paramètres, renvoie une fonction comme résultat ou effectue les deux opérations en même temps. Les fonctions d'ordre avancé sont une caractéristique clé de la programmation fonctionnelle car elles permettent à des fonctions d'être utilisées comme données. Cela peut conduire à un code plus propre et plus expressif.

Qu'est-ce que la récursivité dans la programmation fonctionnelle?

Recursion est une technique dans laquelle une fonction s'appelle dans sa propre définition. Dans la programmation fonctionnelle, la récursivité est souvent utilisée comme remplacement des boucles car les boucles impliquent des états mutables, qui sont évitées dans la programmation fonctionnelle. La récursivité peut être utilisée pour résoudre une grande variété de problèmes, du calcul des factorielles à la traversée des arbres.

Qu'est-ce que le curry dans la programmation fonctionnelle?

Le curry est une technique de programmation fonctionnelle dans laquelle une fonction avec plusieurs paramètres est convertie en une série de fonctions, chaque fonction n'a qu'un seul paramètre. Cela permet d'appliquer une partie de la fonction, où une fonction s'applique à certains de ses paramètres et renvoie une nouvelle fonction qui prend le reste des paramètres.

Qu'est-ce que la programmation réactive fonctionnelle?

La programmation réactive fonctionnelle (FRP) est un paradigme de programmation qui combine la programmation fonctionnelle et réactive. En FRP, les états du programme sont modélisés comme une série de valeurs immuables qui varient dans le temps, et les fonctions sont utilisées pour transformer et combiner ces valeurs. Cela permet de raisonner plus facilement sur les programmes asynchrones et axés sur les événements, car il évite les états mutables et les effets secondaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal