Vous pouvez accomplir une quantité surprenante de style "programmation fonctionnelle" avec le C++ moderne. En fait, le langage s'est orienté dans cette direction depuis sa standardisation.
La bibliothèque standard contient des algorithmes analogues à map, reduce, etc (for_each, transform, adjacent_sum...). La prochaine révision, C++0x, contient de nombreuses fonctionnalités conçues pour permettre aux programmeurs de travailler avec ces algorithmes dans un style plus fonctionnel (expressions lambda, etc.).
Consultez les différentes bibliothèques Boost pour vous amuser davantage. Pour illustrer le fait que le C++ standard contient beaucoup de fonctionnalités, voici une fonction factorielle dans le style du passage par continuation en C++ standard.
#include <iostream>
// abstract base class for a continuation functor
struct continuation {
virtual void operator() (unsigned) const = 0;
};
// accumulating continuation functor
struct accum_cont: public continuation {
private:
unsigned accumulator_;
const continuation &enclosing_;
public:
accum_cont(unsigned accumulator, const continuation &enclosing)
: accumulator_(accumulator), enclosing_(enclosing) {};
virtual void operator() (unsigned n) const {
enclosing_(accumulator_ * n);
};
};
void fact_cps (unsigned n, const continuation &c)
{
if (n == 0)
c(1);
else
fact_cps(n - 1, accum_cont(n, c));
}
int main ()
{
// continuation which displays its' argument when called
struct disp_cont: public continuation {
virtual void operator() (unsigned n) const {
std::cout << n << std::endl;
};
} dc;
// continuation which multiplies its' argument by 2
// and displays it when called
struct mult_cont: public continuation {
virtual void operator() (unsigned n) const {
std::cout << n * 2 << std::endl;
};
} mc;
fact_cps(4, dc); // prints 24
fact_cps(5, mc); // prints 240
return 0;
}
Ok, j'ai un peu menti. C'est une factorielle foncteur . Après tout, les fermetures sont les objets du pauvre... et vice versa. La plupart des techniques fonctionnelles utilisées en C++ reposent sur l'utilisation de foncteurs (c'est-à-dire d'objets fonctionnels) - vous le verrez largement dans la STL.
20 votes
Il est préférable d'utiliser un langage de programmation fonctionnel (LISP, Haskell, Scheme, ...). De cette façon, vous êtes sûr que ce que vous faites est bien de la programmation fonctionnelle.
4 votes
Quel type de caractéristiques de la FP recherchez-vous ? Boost fournit quelques bibliothèques de type FP (mpl, function, lambda, etc) et certaines d'entre elles seront dans C++0x et sont déjà dans TR1.
0 votes
@Brian : Je veux juste avoir un aperçu de la FP sans apprendre un nouveau langage. Et pour l'instant, je ne connais que C++ et Java. Et je pense que Java serait une option encore pire pour la FP.
1 votes
@Marcus : Tous les trucs de base. Je veux juste ressentir la FP. Je veux juste savoir ce qu'il y a dans la FP qui attire tant de gens vers elle ces jours-ci.
10 votes
@Jacob : Vous n'apprendrez probablement pas cela en l'"essayant" en C++. C'est comme si tu disais : "Je veux apprendre ce qui est si génial dans la programmation orientée objet. Comment puis-je faire de la POO en assembleur VAX ?"
0 votes
@Chuck : Alors, que me conseillez-vous de faire ?
0 votes
@Jacob... Je suis d'accord avec Chuck. Apprends juste une nouvelle langue. Le style et les contraintes de la programmation fonctionnelle se manifesteront au fur et à mesure de votre apprentissage. Ma suggestion est de faire un langage fonctionnel impur, comme F#, OCAML, Scala, Closure.
4 votes
@Jacob : Je vous suggère d'apprendre OCaml ou F#. Pour la plupart des gens, se faire une idée de la programmation fonctionnelle est la partie la plus difficile. Apprendre un langage qui vous aide à le faire rendra le travail moins difficile, pas plus.
0 votes
Ok. Je vais vérifier le langage FP. Merci pour les réponses !
7 votes
Bien que je sois d'accord avec Chuck en général, je ne suis pas d'accord avec les suggestions linguistiques spécifiques. Si vous voulez apprendre la programmation fonctionnelle, choisissez un langage qui est conçu pour spécifiquement pour la programmation fonctionnelle. OCaml et F# sont des langages hybrides avec beaucoup de fonctionnalités de POE. Cela signifie qu'une personne familière avec la POO sera tentée d'essayer de rester dans le style familier de la POO. Je me tournerais plutôt vers quelque chose comme SML ou Haskell, où l'on est obligé d'utiliser la PF et rien d'autre.
2 votes
Lisez "Structure et interprétation des programmes d'ordinateur" : mitpress.mit.edu/sicp/full-text/book/book.html
1 votes
Pour ce que ça vaut, vous pouvez être intéressé par Les réflexions de John Carmack sur la programmation fonctionnelle en C++ .