C ++ 0x (C ++ 11) как функциональный язык? - PullRequest
18 голосов
/ 31 января 2011

Мне интересно, является ли C ++ 0x (C ++ 11) (с лямбдами и совершенной пересылкой) функциональным языком (расширенный набор). Есть ли какая-либо особенность функциональных языков, которой нет в C ++?

Ответы [ 2 ]

15 голосов
/ 31 января 2011

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

Однако не все функциональные языки являются чистыми: функциональный язык - это язык с синтаксисом и семантикой, который позволяет программисту эффективно использовать функциональную парадигму. Некоторые из концепций, которые делают возможным использование этой парадигмы, включают, среди прочего, лямбда-выражения с лексическим замыканием, функции высшего порядка, типы вариантов и сопоставление с образцом, ленивая оценка, вывод типов (в случае языков со статической типизацией).

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

Я не знаю достаточно о Boost, чтобы решить, является ли C ++ 03 + Boost жизнеспособным функциональным языком, но C ++ 0x определенно делает C ++ более функциональным, возможно, даже отталкивая его субъективная граница царства функциональных языков.

Кроме того, те же соображения применимы и к другим парадигмам программирования: C ++ также не является чисто объектно-ориентированным языком (действительно, очень сложно - возможно, даже теоретически невозможно) разработать язык, который является как чисто функциональным, так и чисто объектным. -ориентированы), и большинство функций, которые обычно ассоциируются с ОО-языками (классы, наследование, инкапсуляция), на самом деле также никоим образом не являются авторскими ...

5 голосов
/ 31 января 2011

Ознакомьтесь со списком Функциональных языков программирования определений и обсуждений на вики-сайте C2.

Некоторые из наиболее распространенных (и наименее спорных функций):

  • Функции первого класса - function класс представляет функции первого класса.
  • Функции высшего порядка - можно эмулировать с объектами функций.
  • Лексические замыкания - Можно эмулировать с классами.
  • Одиночное назначение - больше соглашения.Вы можете сделать это, объявив все переменные const.
  • Ленивая оценка - Может быть достигнуто с TMP
  • Сборка мусора - все еще отсутствует.В функциональном языке это очень необходимо, поскольку время жизни и область действия не совпадают, как @Pascal указал в комментариях выше.
  • Вывод типа - auto
  • Оптимизация Tail Call - не является строго обязательной для функционального языка, но зависит от компилятора в C ++.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...