Изучение функционального программирования для улучшенного стиля C++11. Хаскель, Лисп или

Я никогда не программировал на "чистом" функциональном языке. Я заработал свои полосы на C и C++, пробовал Java, C#, PHP и т. Д., Но всегда возвращался к C++. Возможно, я немного мазохист, но мне нравятся вещи низкого уровня.

Я также обнаружил, что могу быстро выполнить быструю разработку с помощью встраивания LUA, Python или других языков сценариев (наряду с их ориентацией на быструю разработку).

Короче говоря, я не бросаю C/C++, так что не отговаривайте меня от этого. Однако у меня было мало времени для изучения C++11, и я начинаю чувствовать ускорение кривой функционального программирования в будущем.

Мой вопрос двоякий. Из какого языка "позаимствована" концепция лямбда-функции в C++11, и какой язык будет идеальным, если не для этого, или, если вообще, для понимания "способа" использования нового лямбда-выражения в C++11 функциональность (не каламбур).

PS: честно говоря, я не слишком рад новым "раздутым" дополнениям в C++. Мне нравился C++, как это было, начинаю чувствовать, что язык становится раздутым. Я не буду требовать, чтобы это было фактом; Я слышал, что вы должны испытать функциональный язык, чтобы "получить его".

По правде говоря, в городе появился новый тяжеловес. Сначала это было просто "процедурное" программирование, затем произошла смена парадигмы ООП, в то время как сейчас кажется, что все движется в направлении "функционального" способа ведения дел.

Конечно, процедурное программирование все еще живо (хорошо в классах), я должен задаться вопросом, где лямбда-путь будет соответствовать (должным образом использованному) классу / дизайну. Будет ли это просто заменой процессуальной части? Сделать ООП делом прошлого (пффф)? Или что-то совсем другое (скажем, функциональная система событий, генерирующая события для объектов, инкапсулирующих процедурный код)?

2 ответа

Я постараюсь урезать ваше мнение до тех пор, пока у вас не появится более строгий опыт по этим вопросам.

Перефразируя Бьярна Страуструпа: за последние несколько десятилетий в академических кругах было много эфирного времени, но количество развернутых функциональных систем в промышленности остается на уровне нуля.

Если говорить более конкретно на ваш вопрос, лямбда - это всего лишь краткий синтаксический способ объявления одноэлементного функторного объекта (класса с operator() функция), которая захватывает переменные из окружающей области как переменные-члены. Я бы не стал считать это концепцией "функционального программирования", равно как и любой другой объект в C++.

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

Если вы заинтересованы в функциональном программировании, существует бесплатный онлайн-курс (MOOC), начинающийся прямо сейчас и называемый Принципами функционального программирования в Scala, который служит очень хорошим и очень ценным введением в предмет из одного из ведущих швейцарских университетов.

Я не могу говорить о лямбдах в C++11, но я знаю, что часть обоснования добавления лямбд в Java 8 состоит в том, чтобы включить прозрачную поддержку параллелизма из коробки. Как? Это обеспечивает (ленивый) Stream интерфейс, где вы можете переключаться между параллельной и последовательной обработкой, просто вызывая parallel а также sequential (эти методы возвращают новые потоки и не оказывают побочных эффектов на существующие потоки).

Если вы посмотрите на методы в Stream, вы быстро заметите, что без лямбда-установки их будет крайне сложно использовать. Посмотрите на некоторые примеры того, что вы можете делать с потоками в сочетании с лямбдами.

Должна быть возможность реализовать подобную библиотеку для C++11, если такой библиотеки еще нет.

Другие вопросы по тегам