Với hầu hết tất cả các mã tôi viết, tôi thường giải quyết các vấn đề giảm tập hợp trên các bộ sưu tập mà cuối cùng kết thúc với các điều kiện "nếu" ngây thơ bên trong chúng. Đây là một ví dụ đơn giản:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
Với các ngôn ngữ chức năng, tôi có thể giải quyết vấn đề bằng cách giảm tập hợp thành một tập hợp khác (dễ dàng) và sau đó thực hiện tất cả các thao tác trên tập hợp đã giảm của mình. Trong mã giả:
newCollection <- myCollection where <x=true
map DoStuff newCollection
Và trong các biến thể C khác, như C #, tôi có thể giảm bằng mệnh đề where như
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Hoặc tốt hơn (ít nhất là đối với mắt tôi)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Phải thừa nhận rằng tôi đang thực hiện rất nhiều sự pha trộn mô hình và phong cách dựa trên chủ quan / ý kiến, nhưng tôi không thể không cảm thấy rằng tôi đang thiếu một thứ thực sự cơ bản có thể cho phép tôi sử dụng kỹ thuật ưa thích này với C ++. Ai đó có thể khai sáng cho tôi?
if
bên trong for
mà bạn đề cập không chỉ tương đương nhiều về mặt chức năng với các ví dụ khác mà còn có thể nhanh hơn trong nhiều trường hợp. Ngoài ra đối với những người tuyên bố thích phong cách chức năng, những gì bạn đang quảng cáo dường như đi ngược lại với khái niệm thuần khiết được yêu thích của lập trình chức năng vì DoStuff
rõ ràng có những tác động phụ.
std::copy_if
, nhưng các lựa chọn không phải là lười biếng