W przypadku prawie całego kodu, który piszę, często mam do czynienia z problemami z redukcją zestawów na kolekcjach, które ostatecznie kończą się naiwnymi warunkami „jeśli” w nich. Oto prosty przykład:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Dzięki językom funkcjonalnym mogę rozwiązać problem, redukując zbiór do innego zbioru (łatwo), a następnie wykonując wszystkie operacje na moim zredukowanym zestawie. W pseudokodzie:
newCollection <- myCollection where <x=true
map DoStuff newCollection
A w innych wariantach języka C, takich jak C #, mógłbym zredukować za pomocą klauzuli where, takiej jak
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Albo lepiej (przynajmniej dla moich oczu)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Wprawdzie robię dużo mieszania paradygmatów i stylu opartego na subiektywnych / opiniach, ale nie mogę się powstrzymać od poczucia, że brakuje mi czegoś naprawdę podstawowego, co pozwoliłoby mi użyć tej preferowanej techniki w C ++. Czy ktoś mógłby mnie oświecić?
if
wnętrze, o for
którym wspominasz, jest nie tylko funkcjonalnie równoważne z innymi przykładami, ale prawdopodobnie byłoby również szybsze w wielu przypadkach. Również dla kogoś, kto twierdzi, że lubi styl funkcjonalny, to, co DoStuff
promujesz, wydaje się być sprzeczne z ukochaną koncepcją czystości programowania funkcjonalnego, ponieważ wyraźnie ma efekty uboczne.
std::copy_if
, ale wybory nie są leniwe