Функциональное программирование считается более "математическим"? Если так, то почему?
Время от времени я слышу, как кто-то говорит что-то вроде "функциональные языки программирования более математичны". Это так? Если так, то почему и как? Является ли, например, схема более математической, чем Java или C? Или Хаскелл?
Я не могу точно определить, что такое "математический", но я верю, что вы можете получить чувство.
Спасибо!
5 ответов
Существует две распространенные (*) модели вычислений: модель лямбда-исчисления (LC) и модель Тьюринга (TM).
Лямбда-исчисление приближается к вычислениям, представляя их с помощью математического формализма, в котором результаты создаются композицией функций в области типов. LC также связан с Combinatory Logic, который считается более обобщенным подходом к той же теме.
Модель Тьюринга приближается к вычислениям, представляя их как манипулирование символами, хранящимися в идеализированном хранилище, с использованием совокупности основных операций (таких как сложение, мутация и т. Д.).
Эти разные модели вычислений являются основой для разных семейств языков программирования. Лямбда-исчисление породило такие языки, как ML, Scheme и Haskell. Модель Тьюринга дала начало C, C++, Pascal и другим. Как обобщение, большинство функциональных языков программирования имеют теоретическую основу в лямбда-исчислении.
Из-за природы лямбда-исчисления возможны определенные доказательства поведения систем, построенных на его принципах. На самом деле, доказуемость (т. Е. Правильность) является важной концепцией в LC и делает возможным определенные виды рассуждений и выводов о системах LC. LC также связана (и опирается на) теорию типов и теорию категорий.
Напротив, модели Тьюринга меньше полагаются на теорию типов, а больше на структурирование вычислений как серии переходов состояний в базовой модели. Модели вычислений Тьюринга более сложны, чтобы делать утверждения и не поддаются тем же видам математических доказательств и манипуляций, что и программы на основе LC. Однако это не означает, что такой анализ невозможен - некоторые важные аспекты моделей TM используются при изучении виртуализации и статического анализа программ.
Поскольку функциональное программирование опирается на тщательный отбор типов и преобразование между типами, FP может восприниматься как более "математический".
(*) Существуют и другие модели вычислений, но они менее актуальны для этого обсуждения.
Чисто функциональные языки программирования являются примерами функционального исчисления, и поэтому теоретически программы, написанные на функциональном языке, могут быть обоснованы в математическом смысле. В идеале вы хотели бы иметь возможность "доказать", что программа правильная.
На практике такое рассуждение очень сложно, за исключением тривиальных случаев, но все же возможно в некоторой степени. Вы могли бы доказать некоторые свойства программы, например, вы могли бы доказать, что при всех числовых входах в программу выходные данные всегда ограничены в определенном диапазоне.
В нефункциональных языках с изменяемым состоянием и побочными эффектами попытки рассуждать о программе и "доказать" правильность практически невозможны, по крайней мере, на данный момент. С нефункциональными программами вы можете продумывать программу и убеждать себя, что ее части верны, и вы можете запускать модульные тесты, которые проверяют определенные входные данные, но обычно невозможно создать строгие математические доказательства поведения программы.
Я думаю, что одной из основных причин является то, что чисто функциональные языки не имеют побочных эффектов, то есть не имеют изменяемого состояния, они только отображают входные параметры в результирующие значения, что и делает математическая функция.
Логические структуры функционального программирования в значительной степени основаны на лямбда-исчислении. Хотя это может показаться не математическим, основанным исключительно на алгебраических формах математики, оно очень легко написано из дискретной математики.
По сравнению с императивным программированием, оно не предписывает, как именно что-то делать, но что должно быть сделано. Это отражает топологию.
Математическое ощущение функциональных языков программирования происходит от нескольких различных особенностей. Наиболее очевидным является имя; "функциональный", то есть с использованием функций, которые являются фундаментальными для математики. Другая важная причина заключается в том, что функциональное программирование включает в себя определение набора вещей, которые всегда будут истинными, которые благодаря своим взаимодействиям достигают желаемых вычислений - это похоже на то, как выполняются математические доказательства.