logo

Paradigme de programmation fonctionnelle

Introduction
La programmation fonctionnelle est un paradigme de programmation dans lequel nous essayons de tout lier dans un style de fonctions mathématiques pures. Il s’agit d’un style de programmation de type déclaratif. Son objectif principal est de savoir quoi résoudre, contrairement à un style impératif où l'accent est mis sur la manière de résoudre. Il utilise des expressions au lieu d'instructions. Une expression est évaluée pour produire une valeur tandis qu'une instruction est exécutée pour attribuer des variables. Ces fonctions présentent certaines fonctionnalités spéciales décrites ci-dessous.

La programmation fonctionnelle est basée sur le calcul Lambda :
Le calcul lambda est un cadre développé par Alonzo Church pour étudier les calculs avec des fonctions. Il peut être considéré comme le plus petit langage de programmation au monde. Il donne la définition de ce qui est calculable. Tout ce qui peut être calculé par le calcul lambda est calculable. Elle est équivalente à la machine de Turing dans sa capacité à calculer. Il fournit un cadre théorique pour décrire les fonctions et leur évaluation. Il constitue la base de presque tous les langages de programmation fonctionnels actuels.
Fait : Alan Turing était un étudiant d'Alonzo Church qui a créé la machine de Turing qui a jeté les bases d'un style de programmation impératif.



Langages de programmation prenant en charge la programmation fonctionnelle : Haskell, JavaScript, Python, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket.

comment jumeler des écouteurs Beats

Concepts de programmation fonctionnelle :

  • Fonctions pures
  • Récursivité
  • Transparence référentielle Les fonctions sont de première classe et peuvent être d'ordre supérieur. Les variables sont immuables.

Fonctions pures : Ces fonctions ont deux propriétés principales. Premièrement, ils produisent toujours le même résultat pour les mêmes arguments, indépendamment de toute autre chose.
Deuxièmement, ils n'ont aucun effet secondaire, c'est-à-dire qu'ils ne modifient aucun argument, variable locale/globale ou flux d'entrée/sortie.
La propriété ultérieure est appelée immuabilité. Le seul résultat de la fonction pure est la valeur qu’elle renvoie. Ils sont déterministes.
Les programmes réalisés à l'aide de la programmation fonctionnelle sont faciles à déboguer car les fonctions pures n'ont pas d'effets secondaires ni d'E/S cachées. Les fonctions pures facilitent également l'écriture d'applications parallèles/simultanées. Lorsque le code est écrit dans ce style, un compilateur intelligent peut faire beaucoup de choses : il peut paralléliser les instructions, attendre d'évaluer les résultats lorsque cela est nécessaire et mémoriser les résultats puisque les résultats ne changent jamais tant que l'entrée ne change pas.
exemple de la fonction pure :



sum(x, y) // sum is function taking x and y as arguments return x + y // sum is returning sum of x and y without changing them>

Récursion : Il n'y a pas de boucle for ou while dans les langages fonctionnels. L'itération dans les langages fonctionnels est implémentée par récursivité. Les fonctions récursives s'appellent elles-mêmes à plusieurs reprises, jusqu'à ce qu'elles atteignent le cas de base.
exemple de la fonction récursive :

fib(n) if (n <= 1) return 1; else return fib(n - 1) + fib(n - 2);>

Transparence référentielle : Dans les programmes fonctionnels, les variables une fois définies ne changent pas leur valeur tout au long du programme. Les programmes fonctionnels n'ont pas d'instructions d'affectation. Si nous devons stocker une valeur, nous définissons plutôt de nouvelles variables. Cela élimine tout risque d'effets secondaires car n'importe quelle variable peut être remplacée par sa valeur réelle à tout moment de l'exécution. L'état de n'importe quelle variable est constant à tout instant.

hashset vs hashmap

Exemple:



x = x + 1 // this changes the value assigned to the variable x. // So the expression is not referentially transparent.>

Les fonctions sont de première classe et peuvent être d'ordre supérieur : Les fonctions de première classe sont traitées comme des variables de première classe. Les variables de première classe peuvent être transmises aux fonctions en tant que paramètre, peuvent être renvoyées par des fonctions ou stockées dans des structures de données. Les fonctions d'ordre supérieur sont les fonctions qui prennent d'autres fonctions comme arguments et peuvent également renvoyer des fonctions.

est un caractère spécial

Exemple:

show_output(f) // function show_output is declared taking argument f // which are another function f(); // calling passed function print_gfg() // declaring another function print('hello gfg'); show_output(print_gfg) // passing function in another function>

Les variables sont immuables : En programmation fonctionnelle, nous ne pouvons pas modifier une variable une fois qu’elle a été initialisée. Nous pouvons créer de nouvelles variables, mais nous ne pouvons pas modifier les variables existantes, ce qui aide vraiment à maintenir l'état tout au long de l'exécution d'un programme. Une fois que nous avons créé une variable et défini sa valeur, nous pouvons avoir pleinement confiance en sachant que la valeur de cette variable ne changera jamais.

Avantages et inconvénients de la programmation fonctionnelle

Avantages :

  1. Les fonctions pures sont plus faciles à comprendre car elles ne changent aucun état et dépendent uniquement de l’entrée qui leur est donnée. Quel que soit le résultat qu’ils produisent, c’est la valeur de retour qu’ils donnent. Leur signature de fonction donne toutes les informations les concernant c'est à dire leur type de retour et leurs arguments.
  2. La capacité des langages de programmation fonctionnels à traiter les fonctions comme des valeurs et à les transmettre aux fonctions en tant que paramètres rend le code plus lisible et plus facilement compréhensible.
  3. Les tests et le débogage sont plus faciles. Étant donné que les fonctions pures ne prennent que des arguments et produisent une sortie, elles ne produisent aucun changement, ne prennent pas d'entrée et ne produisent aucune sortie cachée. Ils utilisent des valeurs immuables, il devient donc plus facile de vérifier certains problèmes dans les programmes écrits à l'aide de fonctions pures.
  4. Il est utilisé pour implémenter la concurrence/parallélisme car les fonctions pures ne modifient pas les variables ou toute autre donnée en dehors de celles-ci.
  5. Il adopte une évaluation paresseuse qui évite une évaluation répétée car la valeur est évaluée et stockée uniquement lorsqu'elle est nécessaire.

Désavantages:

  1. Parfois, écrire des fonctions pures peut réduire la lisibilité du code.
  2. Écrire des programmes dans un style récursif au lieu d'utiliser des boucles peut être un peu intimidant.
  3. L'écriture de fonctions pures est facile, mais les combiner avec le reste de l'application et les opérations d'E/S est une tâche difficile.
  4. Les valeurs immuables et la récursion peuvent entraîner une diminution des performances.

Applications:

  • Il est utilisé dans les calculs mathématiques.
  • Il est nécessaire lorsque la concurrence ou le parallélisme est requis.

Fait : Whatsapp n’a besoin que de 50 ingénieurs pour ses 900 M utilisateurs car Erlang est utilisé pour mettre en œuvre ses besoins de concurrence. Facebook utilise Haskell dans son système anti-spam.

sous-chaîne en bash