Avec presque tout le code que j'écris, je suis souvent confronté à des problèmes de réduction d'ensembles sur des collections qui finissent par se retrouver avec des conditions naïves «si» à l'intérieur. Voici un exemple simple:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Avec les langages fonctionnels, je peux résoudre le problème en réduisant la collection à une autre collection (facilement) et ensuite effectuer toutes les opérations sur mon ensemble réduit. En pseudocode:
newCollection <- myCollection where <x=true
map DoStuff newCollection
Et dans d'autres variantes C, comme C #, je pourrais réduire avec une clause where comme
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Ou mieux (du moins à mes yeux)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Certes, je fais beaucoup de mélange de paradigmes et de style subjectif / basé sur l'opinion, mais je ne peux m'empêcher de penser qu'il me manque quelque chose de vraiment fondamental qui pourrait me permettre d'utiliser cette technique préférée avec C ++. Quelqu'un pourrait-il m'éclairer?
if
intérieur d'un que for
vous mentionnez n'est pas seulement à peu près équivalent sur le plan fonctionnel aux autres exemples, mais qu'il serait probablement aussi plus rapide dans de nombreux cas. Aussi pour quelqu'un qui prétend aimer le style fonctionnel, ce que vous promouvez semble aller à l'encontre du concept de pureté très apprécié de la programmation fonctionnelle depuisDoStuff
il a clairement des effets secondaires.
std::copy_if
, mais les sélections ne sont pas paresseuses