Dengan hampir semua kode yang saya tulis, saya sering berurusan dengan masalah pengurangan set pada koleksi yang pada akhirnya berakhir dengan kondisi "jika" yang naif di dalamnya. Berikut contoh sederhananya:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Dengan bahasa fungsional, saya dapat memecahkan masalah dengan mengurangi koleksi ke koleksi lain (dengan mudah) dan kemudian melakukan semua operasi pada set saya yang dikurangi. Dalam pseudocode:
newCollection <- myCollection where <x=true
map DoStuff newCollection
Dan pada varian C lainnya, seperti C #, saya bisa menguranginya dengan klausa where
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Atau lebih baik (setidaknya di mataku)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Memang, saya melakukan banyak pencampuran paradigma dan gaya berbasis opini / subjektif, tetapi saya merasa bahwa saya kehilangan sesuatu yang sangat mendasar yang memungkinkan saya menggunakan teknik yang disukai ini dengan C ++. Bisakah seseorang mencerahkan saya?
if
dalam yang for
Anda sebutkan tidak hanya secara fungsional setara dengan contoh lain tetapi juga mungkin akan lebih cepat dalam banyak kasus. Juga untuk seseorang yang mengklaim menyukai gaya fungsional, apa yang Anda promosikan tampaknya bertentangan dengan konsep kemurnian pemrograman fungsional yang sangat disukai karena DoStuff
jelas memiliki efek samping.
std::copy_if
, tetapi pilihannya tidak malas