71 votes

Programmation fonctionnelle et programmation non fonctionnelle

Dans ma deuxième année d'Université, nous avons été "enseigné" Haskell, je sais presque rien sur elle, et encore moins sur la programmation fonctionnelle.

Qu'est-ce que la programmation fonctionnelle, pourquoi et/xor où voudrais-je utiliser à la place de la non-programmation fonctionnelle et ai-je raison de penser que C est un non-langage de programmation fonctionnel?

Rubriques connexes
Ce qui est un bon début et un texte sur la programmation fonctionnelle?

90voto

Kyle Cronin Points 35834

Une fonction clé dans un langage fonctionnel, c'est le concept de première classe de fonctions. L'idée est que vous pouvez passer des fonctions en tant que paramètres à d'autres fonctions et, de retour en tant que valeurs.

Programmation fonctionnelle consiste à écrire du code qui ne change pas d'état. La principale raison pour le faire est de sorte que les appels à une fonction qui permet d'aboutir au même résultat. Vous pouvez écrire du code fonctionnel dans une langue qui prend en charge de première classe de fonctions, mais il y a certaines langues, comme Haskell, qui ne vous permettent pas de modifier l'état. En fait, vous n'êtes pas censé faire des effets secondaires (comme l'impression de texte) à tout ce qui sonne comme il pourrait être tout à fait inutile.

Haskell au lieu emploie une approche différente de la IO: monades. Ce sont des objets qui contiennent de l'souhaité IO opération devant être exécutée par votre interprète du générique. À tout autre niveau, ils sont tout simplement des objets dans le système.

Quels sont les avantages de la programmation fonctionnelle fournir? Programmation fonctionnelle permet de codage avec moins de potentiel de bugs parce que chaque composant est complètement isolé. Aussi, l'utilisation de la récursivité et de première classe de fonctions, permet pour de simples preuves de l'exactitude généralement dans le miroir de la structure du code.

24voto

Jon Harrop Points 26951

Qu'est-ce que la programmation fonctionnelle

Il y a deux définitions différentes de "programmation fonctionnelle" d'usage courant aujourd'hui:

L'ancienne définition (provenant de Lisp) est que la programmation fonctionnelle est à propos de la programmation à l'aide de première classe de fonctions, c'est à dire où les fonctions sont traitées comme n'importe quelle autre valeur, de sorte que vous pouvez passer à des fonctions comme arguments à d'autres fonctions et de la fonction peut retourner des fonctions entre leurs valeurs de retour. Ce qui culmine dans l'utilisation de fonctions d'ordre supérieur tels que l' map et reduce (vous avez peut-être entendu parler de l' mapReduce comme une seule opération, largement utilisé par Google et, sans surprise, c'est un proche parent!). L' .Types de filets System.Func et System.Action faire des fonctions d'ordre supérieur disponible en C#. Bien que le nourrissage n'est pas pratique en C#, les fonctions qui acceptent d'autres fonctions comme arguments sont communs, par exemple l' Parallel.For fonction.

La jeune définition (popularisé par Haskell), c'est que la programmation fonctionnelle est également sur la réduction et le contrôle des effets secondaires, y compris la mutation, c'est à dire l'écriture de programmes qui permettent de résoudre les problèmes par la composition d'expressions. Ce qui est plus communément appelé "purement fonctionnelle de la programmation". Ceci est rendu possible par sauvagement les différentes approches des structures de données appelées "purement fonctionnelle des structures de données". Un problème est que la traduction traditionnelle impératif algorithmes pour une utilisation purement fonctionnelle des structures de données généralement performances de 10x pire. Haskell est le seul survivant purement langage de programmation fonctionnel, mais les concepts sont glissées dans la programmation grand public avec des bibliothèques comme Linq sur .NET.

où voudrais-je utiliser à la place de la non-programmation fonctionnelle

Partout. Les Lambdas en C# ont démontré un intérêt majeur. C++11 a lambdas. Il n'y a aucune excuse pour ne pas utiliser les fonctions d'ordre supérieur maintenant. Si vous pouvez utiliser un langage comme F#, vous pourrez également bénéficier d'une inférence de type, automatique, la généralisation, le nourrissage et l'application partielle (ainsi que beaucoup d'autres fonctionnalités de langage!).

ai-je raison de penser que C est un non-langage de programmation fonctionnel?

Oui. C est un langage procédural. Cependant, vous pouvez obtenir quelques-uns des avantages de la programmation fonctionnelle en utilisant des pointeurs de fonction et d' void * en C.

6voto

Rob Cooper Points 15945

Peut-être la peine de vérifier cet article sur F# "101" sur le CoDe Mag récemment publié.

Aussi, Dustin Campbell a un super blog où il a publié de nombreux articles sur ses aventures à se lever à la vitesse avec F#..

J'espère que vous trouverez ces utile :)

EDIT:

Aussi, juste pour ajouter, ma compréhension de la programmation fonctionnelle, c'est que tout est une fonction, ou de paramètres à une fonction, plutôt que des instances/stateful objets.. Mais j'ai peut-être tort de F# est quelque chose que je suis en train de mourir à obtenir, mais juste ne pas avoir le temps! :)

4voto

Konrad Rudolph Points 231505

Dans ma deuxième année d'Université, nous avons été "enseigné" Haskell [...]

Qu'est-ce que la programmation fonctionnelle [...] et ai-je raison de penser que C est un non-langage de programmation fonctionnel?

Homme, votre cours doit vraiment avoir sucé. Désolé d'être si cynique. De toute façon, avoir un regard sur ces questions connexes:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X