Мне интересно, является ли С++ 0x (С++ 11) (с lambdas и совершенной переадресацией) (надмножеством) функционального языка. есть ли какая-либо особенность функциональных языков, что С++ не имеет?
С++ 0x (С++ 11) как функциональный язык?
Ответ 1
Моделирование парадигмы функционального программирования как отношение между множествами и, следовательно, по своей сути декларативно. Однако на практике мы часто думаем о том, что функции необходимы, т.е. Вы вводите входное значение и получаете выходное значение, как и в случае с процедурой. С этой точки зрения характеристическое свойство функции состоит в том, что она не имеет побочных эффектов. Из-за двусмысленности терминов мы называем такую функцию чистой, а язык, который имеет только чистые функции, будет чисто функциональным языком.
Однако не все функциональные языки чисты: функциональный язык - это язык с синтаксисом и семантикой, который позволяет программисту эффективно использовать функциональную парадигму. Некоторые из концепций, которые делают возможным использование парадигмы, включают, среди прочего, лямбда-выражения с лексическим замыканием, функции более высокого порядка, варианты типов и сопоставление образцов, ленивую оценку, тип-вывод (в случае статически типизированных языков).
Это ни в коем случае не является официальным списком, и язык вполне может функционировать без предоставления всех или даже большинства из них, но если язык делает это - то есть делает их пригодными для использования без необходимости перескакивать через крупные обручи - их присутствие сильный индикатор того, что язык следует считать функциональным.
Я не знаю достаточно о Boost, чтобы решить, является ли С++ 03 + Boost жизнеспособным функциональным языком, но С++ 0x определенно делает С++ более функциональным, возможно, даже подталкивая его к субъективной границе области функциональных языков.
Как и в стороне, те же соображения применимы и к другим парадигмам программирования: С++ также не является чисто объектно-ориентированным языком (действительно, очень сложно - возможно, даже теоретически невозможно - создать язык, который является чисто функциональным и чисто объектным -ориентированный), и большинство функций, которые обычно ассоциируются с OO-языками (классы, наследование, инкапсуляция), на самом деле никоим образом не являются авторитарными...
Ответ 2
Ознакомьтесь со списком Функциональные языки программирования и обсудите с вики C2.
Некоторые из наиболее распространенных (и наименее оспариваемых) функций:
- Функции первого класса -
function
класс представляет функции первого класса. - Функции более высокого порядка - могут быть эмулированы с объектами функции.
- Лексические замыкания - могут быть эмулированы с классами.
- Единое назначение - больше соглашения. Вы можете сделать это, объявив все переменные
const
. - Lazy Evaluation - может быть достигнуто с помощью TMP
- Коллекция мусора - все еще отсутствует. Довольно многое необходимо на функциональном языке, поскольку время жизни и область видимости не совпадают, как отметил @Pascal в комментариях выше.
- Тип вывода -
auto
- Оптимизация звонков с хвостом - не обязательно для функционального языка, но зависит от компилятора на С++.