Con quasi tutto il codice che scrivo, spesso ho a che fare con problemi di riduzione dei set su raccolte che alla fine si ritrovano con ingenue condizioni "se" al loro interno. Ecco un semplice esempio:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Con i linguaggi funzionali, posso risolvere il problema riducendo la raccolta a un'altra raccolta (facilmente) e quindi eseguire tutte le operazioni sul mio set ridotto. In pseudocodice:
newCollection <- myCollection where <x=true
map DoStuff newCollection
E in altre varianti C, come C #, potrei ridurre con una clausola where come
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
O meglio (almeno ai miei occhi)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Certo, sto facendo un sacco di mix di paradigmi e stili soggettivi / basati su opinioni, ma non posso fare a meno di sentire che mi manca qualcosa di veramente fondamentale che potrebbe permettermi di usare questa tecnica preferita con C ++. Qualcuno potrebbe illuminarmi?
if
interno a for
che citi non solo è praticamente equivalente dal punto di vista funzionale agli altri esempi, ma probabilmente sarebbe anche più veloce in molti casi. Anche per qualcuno a cui piace lo stile funzionale, ciò che stai promuovendo sembra andare contro il concetto di purezza tanto amato dalla programmazione funzionale poiché DoStuff
ha chiaramente effetti collaterali.
std::copy_if
, ma le selezioni non sono pigre