Я смотрел новые функции на С++ 11, и действительно похоже, что с ним можно будет программировать в очень функциональном стиле программирования. Я использовал использование типов List, Seq, Array в F #, и я не вижу причин, по которым их члены не могли быть перенесены в какой-то шаблон С++ 11. Какие проблемы или преимущества вы видите в использовании С++ 11 против чего-то типа F # для смешанного функционального стиля программирования? Возможно, ребята Boost сделают новый functional
, как только выйдет С++ 11.
Функциональное программирование в стиле С++ 11, F #
Ответ 1
Самая большая проблема с попыткой программирования в функциональном стиле на С++ заключается в том, что он не поддерживает хвостовую рекурсию. На функциональном языке вам не нужно беспокоиться о взрыве стека, когда вы правильно кормите хвост, но на С++ вам всегда нужно беспокоиться об этом. Поэтому многие алгоритмы "функционального" типа будут неуклюжими или тяжелыми.
Ответ 2
Вам может показаться интересным:
Ответ 3
Вот некоторые из проблем, с которыми я столкнулся, пытаясь написать функциональный код на С#, смешанный с некоторыми лакомствами с моего времени, когда я все еще использовал С++:
- Отсутствие соответствия шаблону. Как только вы привыкнете к нему, не имея его, вы можете свести меня с ума.
- Отсутствие синтаксического сахара для кортежей.
- Отсутствие синтаксиса для копирования записей и установки полей за один раз.
- Отсутствие синтаксиса для списков и массивов. Это касается конструкторов и сопоставления шаблонов.
- Отсутствие GC и небезопасные обращения к памяти. Не сдерживание GC является преимуществом, но, помня о отчетах, которые я получил от своих первых запусков Valgrind на С++-коде, я думал, что ошибка была пугающей меня навсегда.
- Понимание кода шаблона не совсем доступно для всех смертных. У меня нет проблем с пониманием моего, но всякий раз, когда я смотрел на реализации STL, boost или cgal, я сам задавался вопросом, какой язык они используют. Мой С++ и их С++ не живут в одном и том же мире.
- Полное отсутствие удовольствия при работе с библиотекой, использующей другую версию boost (или любую библиотеку, использующую шаблоны).
- Вербность отдельных файлов заголовков/реализации.
- Вывод типа в С++ не доходит до, например, F #. Я знаю, что это было улучшено в С++ 11, но, как я понимаю, это похоже на var в С#, чего недостаточно, если вы попробовали F # -стильный вывод.
- Отсутствие выражений вычисления, включая выражения последовательности, понимания, async...
Не удивительно, если бы некоторые из этих пунктов были на самом деле возможны на С++, используя некоторые шаблоны и препроцессорную магию, но вы не можете использовать их в производственной среде, если у вас нет очень предприимчивых и терпимых сотрудников.
Я раньше был умным С++ энтузиастом. Затем я начал использовать общее программирование с шаблонами и функциями более высокого порядка с использованием объектов функций. Это было слишком утомительно, чтобы писать. После того, как я попробовал функциональный язык, я никогда не оглядывался назад.
Ответ 4
Какие проблемы преимущества вы видите в использовании С++ 0x против чего-то типа f # для смешанного функционального стиля программирования?
проблема с восходящей потерей, которая обсуждалась в контексте Lisp 40 лет назад!
Ответ 5
Я предполагаю, что было бы... интересно... реализовать определенные оптимизации, общие для функциональных языков в С++ 0x (например, исключение общего подвыражения).