Код, полученный из функциональных языков, использует множество функций, которые вы видите в различной степени в нефункциональных языках. Сборка мусора перешла в общее использование. Оптимизация хвостового вызова выполняется в GCC и VC ++ .
Однако замыкания являются отличительной чертой функционального программирования. Вы не видите одно без другого. Если вы определяете «функциональные языки» для ссылки только на чисто функциональные языки, они не являются синонимами, поскольку вы обнаружите замыкания в императивных языках, которые поддерживают функциональное программирование (например, Javascript и Scheme (что является технически обязательным, хотя функциональная парадигма - это то, что в основном используемый)). Замыкания могут быть реализованы с помощью стека спагетти для стека вызовов, либо путем копирования локальных переменных при выходе из стекового фрейма, либо путем выделения локальных переменных в куче и предоставления возможности для сбора мусора позаботиться о них.
Когда у вас есть замыкания, анонимные функции относительно просты (с переводчиком они действительно просты). При использовании компилятора функция преобразуется в байт-код во время компиляции, а байт-код (точнее, адрес точки входа) ассоциируется во время выполнения с текущей средой.
Композиция функций может полагаться на анонимную функцию. Когда компилятор встречает оператор композиции функции f . g
, он создает анонимную функцию, которая вызывает два аргумента f
и g
, передавая результат одного в качестве аргумента другому.
Монады могут быть реализованы на ОО-языках, они просто не так необходимы, как на чисто функциональных языках. Монады ввода / вывода не являются чем-то особенным, они просто полагаются на тот факт, что лежащая в его основе платформа допускает побочные эффекты.