Изучение функционального программирования для улучшенного стиля 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, если такой библиотеки еще нет.