Com quase todo o código que escrevo, frequentemente estou lidando com problemas de redução de conjuntos em coleções que acabam resultando em condições ingênuas "se" dentro delas. Aqui está um exemplo simples:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Com linguagens funcionais, posso resolver o problema reduzindo a coleção para outra coleção (facilmente) e, em seguida, realizar todas as operações em meu conjunto reduzido. Em pseudocódigo:
newCollection <- myCollection where <x=true
map DoStuff newCollection
E em outras variantes C, como C #, eu poderia reduzir com uma cláusula where como
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Ou melhor (pelo menos aos meus olhos)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Reconheço que estou fazendo muita mistura de paradigmas e estilo subjetivo / baseado em opinião, mas não posso deixar de sentir que estou perdendo algo realmente fundamental que poderia me permitir usar essa técnica preferida com C ++. Alguém poderia me esclarecer?
if
interior de um que for
você mencionou não é apenas funcionalmente equivalente aos outros exemplos, mas também provavelmente seria mais rápido em muitos casos. Também para alguém que afirma gostar de estilo funcional, o que você está promovendo parece ir contra o querido conceito de pureza da programação funcional, uma vez que DoStuff
claramente tem efeitos colaterais.
std::copy_if
, mas as seleções não são preguiçosas