2013-06-03 2 views
9

Я читал эту статью: http://en.wikipedia.org/wiki/Function_pointer и я растерялся. Поскольку C/C++ поддерживают указатели на функции, не означает ли это, что они поддерживают функциональное программирование в целом? Обратите внимание: я действительно не хочу использовать C или C++ для функционального программирования, но мне любопытно, потому что я никогда не слышал, чтобы C или C++ поддерживали такую ​​вещь. (Я знаю, что компиляторы для многих языков функционального программирования существуют в C, но это не то, что я действительно имею в виду под «поддержкой»).Функциональное программирование на C/C++?

+0

@cdbitesky, я думаю, что это немного несправедливо. Вопрос относительно точен в попытке выяснить роль указателей функций в разрешении функционального программирования в целом. Очевидно, мы можем немного охарактеризовать технические определения «функционального программирования», но, думаю, я обратился к этому в своем ответе. – Gian

ответ

7

Редактировать: Я не уверен, почему этот ответ вызывает столько ненависти. В вопросе конкретно задаются указатели на функции, и означает ли их присутствие, что C++ поддерживает «функциональное программирование в целом».

В некотором техническом, не очень полезном способе: да *. Сущностью «функционального» программирования является то, что функции являются значениями. C и C++ не окажут вам никакой помощи с точки зрения таких вещей, как легкое создание и уничтожение lexical closures, а также не окажут вам каких-либо преимуществ с точки зрения partial application. Тот факт, что вы можете имитировать внешний вид функций, которые ведут себя как значения с помощью указателей функций, на самом деле является следствием эквивалентных языков выразительности. Попытка скомпоновать это с «функциональным программированием» действительно глубоко проникает в тэринг Тьюринга.

* Для действительно технического отличия, C и C++ действительно не имеют функциональных символов значений. Указатель функции отличается от значения функции, хотя они выглядят похожими, если вы прищурились.

+1

Как насчет функторов? Они являются стандартным способом использования STL. В C++ 11 у вас есть мономорфные лямбды, а в C++ 14 у вас есть общие лямбды. – gnzlbg

+2

Вы можете интерпретировать мой ответ как ложный для C++ 14. Вопрос был действительно о указателях функции. – Gian

14

Функциональное программирование (посмотрите, если вы действительно заинтересованы) имеет мало общего с указателями функций или их отсутствием.

C++ - это язык с несколькими парадигмами с большой поддержкой FP, особенно в более поздних версиях. Многие люди, работающие с WG21, любят FP и настаивают на поддержке. В C++ 11 у нас даже появился лямбда и в дебюте полиморфных лямбдов C++ 14. Это касается многих вещей. В то время как функции остаются гражданами второго сорта, лямбда может взять на себя штраф.

К сожалению, обработка хвостовых рекурсий по-прежнему не является обязательной, но компиляторы фактически ее обрабатывают, и в последнее десятилетие даже удобно сообщать о «бесконечной рекурсии», когда вы просто перепутали перегрузку const. :)

Вы можете пойти довольно далеко, используя стиль FP на C++, и изучение его поможет вам улучшить код, даже если вы выбрали другие стили. Я призываю всех изучить SICP.

+0

Я на самом деле пытаюсь изучить OCaml прямо сейчас, что и привело к моей поисковой Википедии и натолкнувшись на указатели функций. Наверное, я прыгнул с пистолета, задав этот вопрос, не понимая, какое функциональное программирование еще нет. – user2258552

4

Вы можете выполнять функциональное программирование на C++, хотя язык точно не помогает. Функциональное программирование первого порядка, где вы просто используете неизменяемые ценности как можно больше, конечно, достаточно просто, и хотя это не совсем просто, вы можете реально реализовать monads!

Смежные вопросы