Функциональное программирование считается более "математическим"? Если так, то почему?

Время от времени я слышу, как кто-то говорит что-то вроде "функциональные языки программирования более математичны". Это так? Если так, то почему и как? Является ли, например, схема более математической, чем Java или C? Или Хаскелл?

Я не могу точно определить, что такое "математический", но я верю, что вы можете получить чувство.

Спасибо!

5 ответов

Решение

Существует две распространенные (*) модели вычислений: модель лямбда-исчисления (LC) и модель Тьюринга (TM).

Лямбда-исчисление приближается к вычислениям, представляя их с помощью математического формализма, в котором результаты создаются композицией функций в области типов. LC также связан с Combinatory Logic, который считается более обобщенным подходом к той же теме.

Модель Тьюринга приближается к вычислениям, представляя их как манипулирование символами, хранящимися в идеализированном хранилище, с использованием совокупности основных операций (таких как сложение, мутация и т. Д.).

Эти разные модели вычислений являются основой для разных семейств языков программирования. Лямбда-исчисление породило такие языки, как ML, Scheme и Haskell. Модель Тьюринга дала начало C, C++, Pascal и другим. Как обобщение, большинство функциональных языков программирования имеют теоретическую основу в лямбда-исчислении.

Из-за природы лямбда-исчисления возможны определенные доказательства поведения систем, построенных на его принципах. На самом деле, доказуемость (т. Е. Правильность) является важной концепцией в LC и делает возможным определенные виды рассуждений и выводов о системах LC. LC также связана (и опирается на) теорию типов и теорию категорий.

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

Поскольку функциональное программирование опирается на тщательный отбор типов и преобразование между типами, FP может восприниматься как более "математический".

(*) Существуют и другие модели вычислений, но они менее актуальны для этого обсуждения.

Чисто функциональные языки программирования являются примерами функционального исчисления, и поэтому теоретически программы, написанные на функциональном языке, могут быть обоснованы в математическом смысле. В идеале вы хотели бы иметь возможность "доказать", что программа правильная.

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

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

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

Логические структуры функционального программирования в значительной степени основаны на лямбда-исчислении. Хотя это может показаться не математическим, основанным исключительно на алгебраических формах математики, оно очень легко написано из дискретной математики.

По сравнению с императивным программированием, оно не предписывает, как именно что-то делать, но что должно быть сделано. Это отражает топологию.

Математическое ощущение функциональных языков программирования происходит от нескольких различных особенностей. Наиболее очевидным является имя; "функциональный", то есть с использованием функций, которые являются фундаментальными для математики. Другая важная причина заключается в том, что функциональное программирование включает в себя определение набора вещей, которые всегда будут истинными, которые благодаря своим взаимодействиям достигают желаемых вычислений - это похоже на то, как выполняются математические доказательства.

Другие вопросы по тегам