Con casi todo el código que escribo, a menudo me enfrento con problemas de reducción de conjuntos en colecciones que, en última instancia, terminan con condiciones ingenuas "si" dentro de ellas. He aquí un ejemplo sencillo:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Con lenguajes funcionales, puedo resolver el problema reduciendo la colección a otra colección (fácilmente) y luego realizar todas las operaciones en mi conjunto reducido. En pseudocódigo:
newCollection <- myCollection where <x=true
map DoStuff newCollection
Y en otras variantes de C, como C #, podría reducir con una cláusula where como
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
O mejor (al menos a mis ojos)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Es cierto que estoy haciendo mucha mezcla de paradigmas y estilo subjetivo / basado en opiniones, pero no puedo evitar sentir que me falta algo realmente fundamental que podría permitirme usar esta técnica preferida con C ++. ¿Alguien podría iluminarme?
if
interior for
que mencionas no solo es funcionalmente equivalente a los otros ejemplos, sino que probablemente también sería más rápido en muchos casos. También para alguien que dice que le gusta el estilo funcional, lo que está promocionando parece ir en contra del concepto de pureza muy querido de la programación funcional, ya que DoStuff
claramente tiene efectos secundarios.
std::copy_if
, pero las selecciones no son perezosas