2013-06-03 51 views
9

Tôi đã đọc bài viết này: http://en.wikipedia.org/wiki/Function_pointer và tôi rất bối rối. Vì các con trỏ hàm hỗ trợ C/C++, điều đó không có nghĩa là chúng hỗ trợ lập trình chức năng nói chung? Lưu ý rằng tôi không thực sự muốn sử dụng C hoặc C++ cho lập trình hàm, nhưng tôi tò mò vì tôi chưa bao giờ nghe nói rằng C hoặc C++ hỗ trợ một điều như vậy. (Tôi biết rằng trình biên dịch cho nhiều ngôn ngữ lập trình chức năng tồn tại trong C, nhưng đó không phải là những gì tôi thực sự có nghĩa là "hỗ trợ").Lập trình chức năng trong C/C++?

+0

@cdbitesky, tôi nghĩ điều đó không công bằng chút nào. Câu hỏi là tương đối chính xác trong việc cố gắng xác định vai trò của các con trỏ hàm trong việc cho phép lập trình hàm nói chung. Rõ ràng chúng ta có thể giải thích một chút về các định nghĩa kỹ thuật của "lập trình chức năng", nhưng tôi nghĩ rằng tôi đã giải quyết vấn đề này trong câu trả lời của mình. – Gian

Trả lời

7

Chỉnh sửa: Tôi không chắc tại sao câu trả lời này lại quá ghét. Câu hỏi đặt ra cụ thể về con trỏ hàm và liệu sự hiện diện của chúng có nghĩa là C++ hỗ trợ "lập trình chức năng nói chung" hay không.

Theo cách kỹ thuật, không hữu ích: có *. Bản chất thực sự của lập trình "chức năng" là các hàm là các giá trị. C và C++ sẽ không cung cấp cho bạn bất kỳ trợ giúp nào về những thứ như việc tạo và tiêu hủy dễ dàng lexical closures, cũng như bạn sẽ không có bất kỳ ưu đãi nào về mặt số partial application. Thực tế là bạn có thể mô phỏng sự xuất hiện của các hàm hoạt động giống như các giá trị sử dụng các con trỏ hàm thực sự chỉ là một hệ quả của các ngôn ngữ biểu thức tương đương. Cố gắng để conflate này với "lập trình chức năng" thực sự lội sâu vào tarpit Turing.

* Để có sự phân biệt thực sự về mặt kỹ thuật, C và C++ thực sự không có bất kỳ giá trị chức năng nào được nhập giá trị. Một con trỏ hàm khác biệt với một giá trị hàm, mặc dù chúng trông tương tự nếu bạn nheo mắt.

+1

Điều gì về các functors? Chúng là cách tiêu chuẩn để sử dụng STL. Trong C++ 11 bạn có lambdas đơn hình, và trong C++ 14 bạn có lambdas chung. – gnzlbg

+2

Bạn có thể chọn diễn giải câu trả lời của tôi là sai cho C++ 14. Câu hỏi thực sự là về các con trỏ hàm. – Gian

14

Lập trình chức năng (vui lòng tra cứu nếu bạn thực sự quan tâm) có rất ít việc phải làm với các con trỏ hàm hoặc thiếu chúng.

C++ là ngôn ngữ đa mô hình với rất nhiều hỗ trợ cho FP, đặc biệt là các phiên bản sau. Nhiều người làm việc với WG21 như FP và thúc đẩy hỗ trợ. Trong C++ 11, chúng ta thậm chí đã có lambda và trong C++ 14 đa hình lambdas ra mắt. Điều đó bao gồm nhiều thứ. Trong khi chức năng ở lại công dân hạng hai lambda có thể mất hơn tiền phạt.

Thật không may, việc xử lý đệ quy đuôi vẫn không bắt buộc, nhưng các trình biên dịch thực sự xử lý nó, và trong thập kỷ qua thậm chí còn thuận tiện báo cáo "đệ quy vô hạn" khi bạn làm hỏng quá tải const. :)

Bạn có thể đi khá xa bằng cách sử dụng phong cách FP trong C++ và việc tìm hiểu nó giúp bạn tạo mã tốt hơn ngay cả khi bạn đã chọn các kiểu khác. Tôi khuyến khích mọi người học tập SICP.

+0

Tôi đang thực sự cố gắng tìm hiểu OCaml ngay bây giờ, đó là những gì đã dẫn đến khám phá Wikipedia của tôi và đi qua các con trỏ hàm. Tôi đoán tôi đã nhảy súng bằng cách đặt câu hỏi này mà không thực sự hiểu được lập trình chức năng nào. – user2258552

4

Bạn có thể lập trình chức năng bằng C++, mặc dù ngôn ngữ không chính xác giúp đỡ. Lập trình chức năng thứ tự đầu tiên, nơi bạn chỉ cần sử dụng các giá trị bất biến càng nhiều càng tốt là chắc chắn dễ dàng, và trong khi không chính xác dễ dàng, bạn thực sự có thể thực hiện monads!

Các vấn đề liên quan