Пример кода Джона Статистика не показывает функциональное программирование, потому что, когда вы занимаетесь функциональным программированием, ключ в том, что код НЕ УКАЗЫВАЕТСЯ (record = thingConstructor(t)
является назначением), и у него НЕТ ПОБОЧНЫХ ЭФФЕКТОВ (localMap.put(record)
это утверждение с побочным эффектом). В результате этих двух ограничений все, что делает функция , полностью фиксируется ее аргументами и возвращаемым значением. Переписать код Statistician так, как он должен выглядеть, если вы хотите эмулировать функциональный язык с использованием C ++:
RT getOrCreate(const T thing,
const Function<RT<T>> thingConstructor,
const Map<T,RT<T>> localMap) {
return localMap.contains(t) ?
localMap.get(t) :
localMap.put(t,thingConstructor(t));
}
В результате применения правила отсутствия побочных эффектов каждый оператор является частью возвращаемого значения (следовательно, return
приходит first ), а каждый оператор является выражением. В языках, которые обеспечивают функциональное программирование, подразумевается ключевое слово return
, а оператор if ведет себя как оператор C ++ * ?:
.
Кроме того, все является неизменным, поэтому localMap.put
должен создать новую копию localMap и вернуть ее вместо изменения исходного localMap , как в обычном C ++ или Ява программа будет. В зависимости от структуры localMap копия может повторно использовать указатели на оригинал, уменьшая объем копируемых данных.
Некоторые из преимуществ функционального программирования включают в себя тот факт, что функциональные программы короче, и легче модифицировать функциональную программу (потому что нет скрытых глобальных эффектов, которые следует принимать во внимание), и легче получить программу прямо во-первых.
Однако функциональные программы, как правило, работают медленно (из-за того, что им приходится копировать), и они не очень хорошо взаимодействуют с другими программами, процессами операционной системы или операционными системами, которые работают с адресами памяти, байтовые байты с прямым порядком байтов и другие машинно-зависимые нефункциональные биты. Степень неинтероперабельности имеет тенденцию обратно коррелировать со степенью функциональной чистоты и строгостью системы типов.
Более популярные функциональные языки имеют действительно очень строгие системы типов. В OCAML вы даже не можете смешивать целочисленные значения и математические вычисления с плавающей точкой или использовать одни и те же операторы (+ - для добавления целых чисел, + - для добавления чисел с плавающей запятой). Это может быть как преимуществом, так и недостатком, в зависимости от того, насколько высоко вы цените способность средства проверки типов обнаруживать ошибки определенного типа.
Функциональные языки также имеют тенденцию иметь действительно большие среды выполнения. Haskell является исключением (исполняемые файлы GHC почти такие же маленькие, как программы на C, как во время компиляции, так и во время выполнения), но программы SML, Common Lisp и Scheme всегда требуют тонны памяти.