Quels sont les avantages de la programmation fonctionnelle? [fermé]

95

Quels sont selon vous les avantages de la programmation fonctionnelle? Et comment s'appliquent-ils aux programmeurs aujourd'hui?

Quelles sont les plus grandes différences entre la programmation fonctionnelle et la POO?

Rayne
la source
5
Le paradoxe de Blub. paulgraham.com/avg.html
missingfaktor

Réponses:

75

Le style de programmation fonctionnelle consiste à décrire ce que vous voulez, plutôt que comment l'obtenir. c'est-à-dire: au lieu de créer une boucle for avec une variable d'itérateur et de parcourir un tableau faisant quelque chose à chaque cellule, vous diriez l'équivalent de "cette étiquette fait référence à une version de ce tableau où cette fonction a été effectuée sur tous les éléments."

La programmation fonctionnelle déplace des idées de programmation plus basiques dans le compilateur, des idées telles que la compréhension de liste et la mise en cache.

Le plus grand avantage de la programmation fonctionnelle est la brièveté, car le code peut être plus concis. Un programme fonctionnel ne crée pas de variable d'itérateur pour être le centre d'une boucle, donc ceci et d'autres types de surcharge sont éliminés de votre code.

L'autre avantage majeur est la concurrence, ce qui est plus facile à faire avec la programmation fonctionnelle car le compilateur prend en charge la plupart des opérations qui nécessitaient auparavant de configurer manuellement des variables d'état (comme l'itérateur dans une boucle).

Certains avantages en termes de performances peuvent également être observés dans le contexte d'un processeur unique, en fonction de la façon dont le programme est écrit, car la plupart des langages fonctionnels et des extensions prennent en charge l'évaluation paresseuse. Dans Haskell, vous pouvez dire "cette étiquette représente un tableau contenant tous les nombres pairs". Un tel tableau est infiniment grand, mais vous pouvez demander le 100 000e élément de ce tableau à tout moment sans avoir à savoir - au moment de l'initialisation du tableau - quelle est la plus grande valeur dont vous aurez besoin. La valeur ne sera calculée que lorsque vous en aurez besoin, et pas plus.

Chris Wenham
la source
12
Je pense que votre premier paragraphe est plus proche de décrire la programmation relationnelle déclarative comme Prolog que la programmation fonctionnelle.
McPherrinM
6
@McPherrinM: les langages fonctionnels sont déclaratifs et non impératifs.
Lie Ryan le
2
Il semble que vous confondez DP vs IP, avec procédural vs FP . FP prévoit la séparation des préoccupations en mettant l'accent sur la composition des fonctions, c'est-à-dire en séparant les dépendances parmi les sous-calculs d'un calcul déterministe.
Shelby Moore III
2
@LieRyan incorrect. S'il vous plaît voir le lien dans mon commentaire précédent
Shelby Moore III
La concurrence consiste à avoir plusieurs threads qui peuvent interagir les uns avec les autres, ce qui est impératif. Faire plusieurs calculs indépendants en même temps est appelé parallélisme . Voir en.wikipedia.org/wiki/Concurrency_(computer_science)
Lambda Fairy
29

Le plus grand avantage est que ce n'est pas ce à quoi vous êtes habitué. Choisissez un langage comme Scheme et apprenez à résoudre les problèmes avec lui, et vous deviendrez un meilleur programmeur dans des langages que vous connaissez déjà. C'est comme apprendre une seconde langue humaine. Vous supposez que les autres sont fondamentalement une variation en soi parce que vous n'avez rien à comparer. L'exposition à d'autres personnes, en particulier celles qui ne sont pas liées à ce que vous savez déjà, est instructive.

Kirk Strauser
la source
28
c'est un avantage de l'apprendre, pas un avantage du paradigme lui
Moe
2
Mais sont-ils vraiment séparés? Du point de vue du questionneur original, je dirais que non - ils recherchent très probablement des avantages au total en dépensant l'effort pour apprendre une langue fonctionnelle.
Kendall Helmstetter Gelner
3
"c'est un avantage de l'apprendre, pas un avantage du paradigme lui-même". Le paradigme se répandra dans vos autres travaux de POO et peut vous aider à y simplifier votre développement. Vous pouvez aborder les problèmes à partir d'un "calcul de cette sortie à partir de cette entrée" et de "composer ces deux fonctions qui calculent de nouvelles données" au lieu de "attendre --- quel était l'état d'une variable partagée là-bas?" et "ai-je fait exécuter ces procédures dans le bon ordre?". Sérieusement, vous obtenez ces avantages (en comprenant le paradigme FP) en Python, C #, C ++, Java, vous l'appelez.
Jared Updike
11

Pourquoi la programmation fonctionnelle est importante
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Abstrait

À mesure que le logiciel devient de plus en plus complexe, il est de plus en plus important de bien le structurer. Un logiciel bien structuré est facile à écrire et à déboguer, et fournit un ensemble de modules qui peuvent être réutilisés pour réduire les coûts de programmation futurs.

Dans cet article, nous montrons que deux caractéristiques des langages fonctionnels en particulier, les fonctions d'ordre supérieur et l'évaluation paresseuse, peuvent contribuer de manière significative à la modularité. À titre d'exemples, nous manipulons des listes et des arbres, programmons plusieurs algorithmes numériques et implémentons l'heuristique alpha-bêta (un algorithme d'Intelligence Artificielle utilisé dans les programmes de jeu). Nous concluons que la modularité étant la clé d'une programmation réussie, la programmation fonctionnelle offre des avantages importants pour le développement logiciel.

Robert Harvey
la source
10

Un bon point de départ serait donc d'essayer de comprendre certaines choses qui ne sont pas possibles dans les langages impératifs mais possibles dans les langages fonctionnels.

Si vous parlez de calculabilité, il n'y a bien sûr rien de possible en programmation fonctionnelle mais pas impérative (ou vice versa).

Le but des différents paradigmes de programmation n'est pas de rendre possible des choses qui n'étaient pas possibles auparavant, c'est de rendre les choses faciles qui étaient difficiles auparavant.

La programmation fonctionnelle vise à vous permettre d'écrire plus facilement des programmes concis, sans bogues et parallélisables.

sepp2k
la source
5

Il n'est pas nécessaire que ce soit l'un ou l'autre: l'utilisation d'un langage comme C # 3.0 vous permet de mélanger les meilleurs éléments de chacun. OO peut être utilisé pour la structure à grande échelle au niveau de la classe et au-dessus, Style fonctionnel pour la structure à petite échelle au niveau de la méthode.

L'utilisation du style fonctionnel permet d'écrire du code qui déclare clairement son intention, sans être mélangé avec des instructions de flux de contrôle, etc. En raison des principes tels que la programmation sans effets secondaires, il est beaucoup plus facile de raisonner sur le code et de vérifier son exactitude .

Samuel Jack
la source
5

Je pense que l'exemple le plus pratique du besoin de programmation fonctionnelle est la simultanéité - les programmes fonctionnels sont naturellement thread-safe et étant donné la montée en puissance du matériel multicœur, c'est de la plus haute importance.

La programmation fonctionnelle augmente également la modularité - vous pouvez souvent voir des méthodes / fonctions en impératif qui sont beaucoup trop longues - vous ne verrez presque jamais une fonction de plus de quelques lignes. Et comme tout est découplé, la réutilisation est bien améliorée et les tests unitaires sont très très faciles.

Bozhidar Batsov
la source
3

Une fois que le programme se développe, le nombre de commandes dans notre vocabulaire devient trop élevé, ce qui le rend très difficile à utiliser. C'est là que la programmation orientée objet nous facilite la vie, car elle nous permet de mieux organiser nos commandes. Nous pouvons associer toutes les commandes qui impliquent le client à une entité client (une classe), ce qui rend la description beaucoup plus claire. Cependant, le programme est toujours une séquence de commandes spécifiant comment il doit procéder.

La programmation fonctionnelle offre une manière complètement différente d'étendre le vocabulaire. Non limité à l'ajout de nouvelles commandes primitives; nous pouvons également ajouter de nouvelles structures de contrôle - des primitives qui spécifient comment nous pouvons assembler des commandes pour créer un programme. Dans les langages impératifs, nous avons pu composer des commandes dans une séquence ou en utilisant un nombre limité de constructions intégrées telles que des boucles, mais si vous regardez des programmes typiques, vous verrez toujours de nombreuses structures récurrentes; méthodes courantes de combinaison de commandes

Soner Gönül
la source
1

Ne pensez pas à la programmation fonctionnelle en termes de «besoin». Au lieu de cela, pensez-y comme une autre technique de programmation qui vous ouvrira l'esprit, tout comme la POO, les modèles, le langage d'assemblage, etc. peuvent avoir complètement changé votre façon de penser lorsque (si) vous les avez appris. En fin de compte, l'apprentissage de la programmation fonctionnelle fera de vous un meilleur programmeur.

Justin Ethier
la source
0

Si vous ne connaissez pas déjà la programmation fonctionnelle, l'apprentissage vous donne plus de moyens de résoudre les problèmes.

FP est une généralisation simple qui promeut les fonctions vers des valeurs de première classe, tandis que la POO est pour la structuration à grande échelle du code. Il y a cependant un certain chevauchement où les modèles de conception POO peuvent être représentés directement et beaucoup plus succinctement à l'aide de fonctions de première classe.

De nombreux langages fournissent à la fois FP et OOP, y compris OCaml, C # 3.0 et F #.

Salutations, Jon Harrop.

JD
la source