web-dev-qa-db-fra.com

Quand utiliser un langage de programmation fonctionnel?

Dans quelles situations dois-je choisir d'utiliser un langage de programmation fonctionnel plutôt qu'un langage orienté objet plus verbeux comme C++, C # ou Java?

Je comprends ce qu'est la programmation fonctionnelle, ce que je ne comprends pas vraiment, c'est pour quels types de problèmes est-ce une solution parfaite?

79
Alex Baranosky

Les langages fonctionnels sont, à mon avis, bons pour principalement deux choses: les IA de jeu et les calculs mathématiques. Il est bon dans les IA de jeu en raison de ses manipulations de liste Nice (au moins dans LISP et Scheme), et pour les calculs mathématiques en raison de sa syntaxe. Scheme, LISP et Haskell ont une syntaxe qui facilite la lecture des calculs mathématiques. La dernière chose que je dois ajouter est que les langages fonctionnels sont vraiment des langages amusants. Mon cours Scheme était l'un des cours avec lesquels je me suis le plus amusé.

47
martiert

J'ai fait des recherches sur ce sujet moi-même et j'ai pensé que je pourrais ajouter la CONCURRENCE à la liste des raisons d'utiliser un langage fonctionnel. Voir à un moment donné dans un avenir proche, la vitesse du processeur ne pourra pas augmenter en utilisant la même technologie de processeur. La physique de l'architecture ne le permettra pas.

C'est donc là qu'intervient le traitement simultané.

Malheureusement, la plupart des langues OOP ne peuvent pas tirer parti de plusieurs processeurs à la fois en raison des interdépendances entre les données.

Dans les langages de programmation fonctionnels purs, l'ordinateur peut exécuter deux (ou plusieurs autres) fonctions à la fois car ces fonctions ne modifient pas les informations d'état extérieures.

Voici un excellent article sur la programmation fonctionnelle que vous pourriez apprécier.

85
Alex Baranosky

Un de mes amis a cité l'un de ses professeurs d'université comme disant ce qui suit:

Dessinez une grille avec des types de données en haut et des opérations sur ces types de données en bas à gauche. Si vous coupez la grille verticalement, vous faites OO; si vous coupez la grille horizontalement, vous faites de la FP.

Ma réponse est que FP est une approche de programmation complètement viable avec une gamme d'applications aussi large que OO. Comme pour toute discussion sur le choix du langage de programmation, je pense que les questions les plus importantes sont:

  1. Avez-vous le temps d'investir dans l'apprentissage d'une nouvelle notation et d'une nouvelle façon de penser?
  2. Lesquelles des langues que vous envisagez ont des bibliothèques suffisamment riches pour ne pas vous retrouver en train de réinventer une roue?

En ce qui concerne la première question, si vous faites cela principalement pour la valeur d'apprentissage, je vous suggère de regarder Haskell , en raison de la large gamme de supports (livres, articles, communauté active, etc.) )

En ce qui concerne la deuxième question, Haskell a une belle gamme de bibliothèques (bien que certaines soient plus matures que d'autres), mais Scala (un langage fonctionnel OO hybride fonctionnant sur la JVM) a les avantages que vous pouvez transition plus progressivement vers le style fonctionnel, et vous disposez de toute la gamme de bibliothèques accessibles par Java.

13
joel.neely

Pratiquement tout ce que vous pouvez faire en PP peut être fait en FP, et la même chose en sens inverse. C'est juste une autre façon de coder quelque chose - une autre perspective sur le problème et une manière différente de le résoudre.

Cependant, parce que peu de gens utilisent FP, le problème concerne davantage le manque de bonnes bibliothèques, la portabilité/maintenabilité (car le responsable a plus de chance de comprendre quelque chose écrit en C++ que Scheme), et le manque de documentation et de communauté. Je sais qu'il existe des documents, cependant, comparez cela à C++, C # ou Java et vous comprendrez ce que je veux dire.

Cependant, si vous voulez vraiment faire de la FP, vous pouvez utiliser ce style même en C++ et C #. Bien sûr, ce ne sera pas un 100% FP si vous utilisez la bibliothèque standard. Malheureusement, je ne pense pas que C # est optimisé pour être utilisé avec la programmation fonctionnelle et il créera probablement beaucoup des problèmes de performance.

C'est plus un post subjectif, ce que je pense de la FP. Ce n'est pas une déclaration rigoureuse.

9
user35978

Les langages fonctionnels sont bons dans beaucoup de situations. Cela dépend des bibliothèques d'un langage fonctionnel particulier.

Comment répondriez-vous à la question "Quand utiliser un langage de programmation orienté objet?"?

4
Jules

Bien que ce soit une question assez subjective, je voudrais juste ajouter que les langages fonctionnels sont beaucoup utilisés pour analyser langages spécifiques au domaine ; la nature fonctionnelle se prête bien à l'analyse syntaxique des grammaires.

3
csl

D'après ce que j'ai vu, c'est plus une question de goût que de fonctionnalité (sans jeu de mots). Il n'y a vraiment rien dans l'un ou l'autre style de langage qui le rend intrinsèquement meilleur ou pire pour des tâches spécifiques.

1
T.E.D.

En général, utilisez la langue dans laquelle il est le plus facile d'exprimer la solution à un problème. Pour la programmation fonctionnelle, c'est lorsque la solution à un problème s'exprime facilement en termes de fonctions , d'où le nom. En général, c'est bon pour les opérations mathématiques, l'IA, la correspondance de motifs; en général, tout ce qui peut être décomposé en un ensemble de règles qui doivent être appliquées pour obtenir une réponse. Vous ne pouvez vraiment déterminer la "meilleure" langue à utiliser qu'après avoir suffisamment analysé votre problème. C'est là que le pseudo-code est utile. Si vous vous retrouvez en train d'écrire un pseudo-code qui ressemble à FP, utilisez FP.

Bien sûr, tous les langages de programmation complets sont fonctionnellement équivalents, donc peu importe celui que vous choisissez en termes de problèmes que vous pouvez résoudre. Les principaux effets seront en termes d'efficacité et de précision du codage et de facilité de maintenance.

Notez également qu'il est possible d'imiter FP dans OO langues grâce à des API intelligemment conçues. Par exemple, j'ai vu de nombreuses bibliothèques Java (JMock en est un exemple) qui utilisent le chaînage de méthodes pour simuler une FP DSL. Ensuite, vous verrez des constructions telles que:

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

Cela crée essentiellement une fonction qui est évaluée pour déterminer si une séquence d'appel sur un objet factice est correcte. (exemple volé à http://www.jmock.org/yoga.html )

Une autre syntaxe de type FP dans les autres langues OO est l'utilisation de fermetures, comme dans Ruby.

1
Phil