В примере кода Джона Статистика не показано функциональное программирование, потому что, когда вы выполняете функциональное программирование, ключевым моментом является то, что код НЕ выполняет НАЗНАЧЕНИЙ (record = thingConstructor(t)
- это присвоение) и НЕ имеет ПОБОЧНЫХ ЭФФЕКТОВ (localMap.put(record)
- это оператор со стороной эффект). В результате этих двух ограничений все, что делает функция, полностью фиксируется ее аргументами и возвращаемым значением. Переписать код статистика так, как он должен выглядеть, если вы хотите эмулировать функциональный язык с использованием 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
идет первым), и каждый оператор является выражением. В языках, требующих функционального программирования, подразумевается ключевое слово return
, а оператор if ведет себя как оператор ?:
в C ++.
Кроме того, все неизменяемо, поэтому localMap.put
должен создать новую копию localMap и вернуть ее вместо изменения исходного localMap, как это сделала бы обычная программа на C ++ или Java. . В зависимости от структуры localMap копия может повторно использовать указатели в оригинале, уменьшая объем данных, которые необходимо скопировать.
Некоторые из преимуществ функционального программирования включают тот факт, что функциональные программы короче, и их легче модифицировать функциональную программу (потому что нет скрытых глобальных эффектов, которые нужно учитывать), и легче получить программу прямо в первое место.
Однако функциональные программы, как правило, работают медленно (из-за того, что им приходится выполнять все операции копирования), и они не склонны хорошо взаимодействовать с другими программами, процессами операционной системы или операционными системами, которые имеют дело с адресами памяти, с прямым порядком байтов. блоки байтов и другие машинно-зависимые, нефункциональные биты. Степень невзаимодействия обычно обратно коррелирует со степенью функциональной чистоты и строгостью системы типов.
Более популярные функциональные языки имеют действительно строгие системы типов. В OCAML нельзя даже смешивать математику с целыми числами и числами с плавающей запятой или использовать одни и те же операторы (+ - для добавления целых чисел, +. - для добавления чисел с плавающей запятой). Это может быть либо преимуществом, либо недостатком, в зависимости от того, насколько высоко вы цените способность средства проверки типов обнаруживать определенные виды ошибок.
Функциональные языки также имеют очень большие среды выполнения. Haskell - исключение (исполняемые файлы GHC почти такие же маленькие, как программы C, как во время компиляции, так и во время выполнения), но программы SML, Common Lisp и Scheme всегда требуют тонны памяти.
person
Community
schedule
18.02.2009