Функциональное программирование в стиле С++ 11, F #

Я смотрел новые функции на С++ 11, и действительно похоже, что с ним можно будет программировать в очень функциональном стиле программирования. Я использовал использование типов List, Seq, Array в F #, и я не вижу причин, по которым их члены не могли быть перенесены в какой-то шаблон С++ 11. Какие проблемы или преимущества вы видите в использовании С++ 11 против чего-то типа F # для смешанного функционального стиля программирования? Возможно, ребята Boost сделают новый functional, как только выйдет С++ 11.

Ответ 1

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

Ответ 3

Вот некоторые из проблем, с которыми я столкнулся, пытаясь написать функциональный код на С#, смешанный с некоторыми лакомствами с моего времени, когда я все еще использовал С++:

  • Отсутствие соответствия шаблону. Как только вы привыкнете к нему, не имея его, вы можете свести меня с ума.
  • Отсутствие синтаксического сахара для кортежей.
  • Отсутствие синтаксиса для копирования записей и установки полей за один раз.
  • Отсутствие синтаксиса для списков и массивов. Это касается конструкторов и сопоставления шаблонов.
  • Отсутствие GC и небезопасные обращения к памяти. Не сдерживание GC является преимуществом, но, помня о отчетах, которые я получил от своих первых запусков Valgrind на С++-коде, я думал, что ошибка была пугающей меня навсегда.
  • Понимание кода шаблона не совсем доступно для всех смертных. У меня нет проблем с пониманием моего, но всякий раз, когда я смотрел на реализации STL, boost или cgal, я сам задавался вопросом, какой язык они используют. Мой С++ и их С++ не живут в одном и том же мире.
  • Полное отсутствие удовольствия при работе с библиотекой, использующей другую версию boost (или любую библиотеку, использующую шаблоны).
  • Вербность отдельных файлов заголовков/реализации.
  • Вывод типа в С++ не доходит до, например, F #. Я знаю, что это было улучшено в С++ 11, но, как я понимаю, это похоже на var в С#, чего недостаточно, если вы попробовали F # -стильный вывод.
  • Отсутствие выражений вычисления, включая выражения последовательности, понимания, async...

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

Я раньше был умным С++ энтузиастом. Затем я начал использовать общее программирование с шаблонами и функциями более высокого порядка с использованием объектов функций. Это было слишком утомительно, чтобы писать. После того, как я попробовал функциональный язык, я никогда не оглядывался назад.

Ответ 4

Какие проблемы преимущества вы видите в использовании С++ 0x против чего-то типа f # для смешанного функционального стиля программирования?

проблема с восходящей потерей, которая обсуждалась в контексте Lisp 40 лет назад!

Ответ 5

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