В чем разница между функциями в математике и функциями в программировании? - PullRequest
22 голосов
/ 31 августа 2010

В чем разница между функциями в математике и функциями в программировании?

Ответы [ 6 ]

22 голосов
/ 31 августа 2010

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

A математическая функция определяется: отношением, которое отображает элементы из одного набора (A) в другой (B), сопоставляя каждый элемент первого набора только с одним из другого набора. В C (как и в других языках программирования) это также верно, у вас есть набор входных данных и набор выходных данных (который почти всегда только ОДИН).

Основное отличие состоит в том, что ВСЕГДА если вы позвоните f(x) по математике, вы получите тот же ответ, но если вы позвоните f'(x) в C, ответ может быть не то же самое (к тем же аргументам не получаются одинаковые выходные данные). (Я думаю, что это немного ложно .. Если у вас есть две точно машины в одном и том же состоянии, они будут выводить то же самое .. но что он пытается сказать является то, что функция в нефункциональных языках может зависеть не только от аргументов, которые вы им даете, но и от других вещей программы)

Другое различие между математическими и C-функциями состоит в том, что в Math вы не можете создать функцию, которая переходит из непустого набора в пустой набор (в C это может быть так: вам не нужно всегда возвращать что-то с вашей функцией). Кроме того, не все функции вычислимы (я не знаю, есть ли что-то подобное в математике ..). У вас нет функций для бесконечных множеств (у вас ограниченная память, поэтому набор возможных входных параметров должен быть конечным), но в математике вы можете определить функцию для бесконечных множеств (например, f: N -> N) и для неисчислимых множеств (например, f: R -> R) (в C у вас есть числа с плавающей запятой, но они представляют собой только сокращенный набор действительных чисел, который является конечным).

Наконец, знайте, что функциональное программирование - это самое близкое к вашим математическим функциям, и вы МОЖЕТЕ использовать C как функциональный язык (или что-то в этом роде). Чек «Функциональный С»

Извините, если мой английский плохой, надеюсь, мой ответ поможет вам.

Сведение

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

6 голосов
/ 31 августа 2010

Это зависит от области (я не имею в виду область функции, я имею в виду область изучения), а также, возможно, от языка.

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

Например, давайте представим, что у нас есть функция rand (), которая считывает атмосферные условия, чтобы получить действительно случайное число. Давайте также представим, что вызывающая функция принимает один целочисленный параметр в качестве своего рода мультипликатора. Является ли следующее функцией?:

int giveRandAtmosWithMul(int mult)
{
    return mult * rand();
}

В математическом смысле это, вероятно, не функция, если вы рассматриваете mult как единственный вход в проблему, но ясно, что rand () также предлагает ввод (даже если rand () всегда имеет одинаковую точку входа в машину код).

Как видите, различия не могут быть объективно определены без какого-либо стандартного протокола, с которым все согласны.

3 голосов
/ 31 августа 2010

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

2 голосов
/ 31 августа 2010

Другие ответы верны - это две разные вещи. Я покажу, наоборот, они связаны. Я буду обозначать функции программирования ->, математические функции =>.

Предположим, у вас есть язык, который поддерживает исключения. В этом случае вы можете думать о функции программирования A -> B как о математической функции A => B + E, где "B + E" означает что-то типа B или что-то типа E. Ваш язык имеет два ключевых слова для возврата из функции, «return» и «throw».

Теперь вы можете составить две функции f: A -> B и g: B -> C, написав g(f(x)). Это функция, которая принимает A и возвращает C. Вы можете сделать это на многих языках, таких как Java или Python. Под капотом, если f(x) выдает исключение, g не вызывается и исключение распространяется, подумайте о g(1/0). Язык позаботится об этом, и вам не нужно проверять, является ли результат f исключением. Способ описать это математически, хотя f: A => B+E и g: B => C+E, язык "поднимает" функцию g в B+E => C+E. g теперь функция, которая может принимать исключение, но просто распространяет его.

Другими словами определить g': B+E => C+E по

        /   g(x)   if x ∈ B
g'(x)= |
        \   x      if x ∈ E

Имея две функции f: A => B+E и g': B+E => C+E, вы можете спокойно составлять их в математическом смысле. И это то, что делает g(f(x)) в программировании, но сначала нужно поднять g в g'.

Подумайте о недетерминизме. Если у вас есть функция A -> B, которая является недетерминированной, вы можете математически описать ее, сказав, что это функция A => Set(B), где Set(B) - набор возможных результатов. Например, если f(1) может дать вам 1, 2 или 3, то математически f(1) = {1,2,3}, хотя во время программирования при запросе f(1) вы получите только одно из этих чисел. Теперь вы можете составлять недетерминированные функции A->B и B->C, написав g(f(x)). Результат будет иметь тип C, но он будет недетерминированным. Математически, составление функций A => Set(B) и B => Set(C) дает вам A => Set(C). Хотя g принимает только одно значение B, вы должны поднять его до недетерминированных значений g': Set(B) => Set(C). Например, g'({1,2}) - это объединение множеств g(1) и g(2). Таким образом, g(f(x)) означает, что вы запускаете f, берете набор всех возможных результатов и запускаете g для каждого из них. Есть два слоя недетерминизма, но они «сплющены» в один.

То же самое с глобальным состоянием. Если вы сделаете каждую глобальную переменную в качестве аргумента функции и результата, вы можете подумать, что глобальных переменных не существует, каждая функция принимает все глобальное состояние, и язык должен передать это состояние при компоновке. Функция A -> B чтения и, возможно, записи состояния S является функцией (A,S) => (B,S), которая также может быть записана как A => (S => (B,S)). Написание этого формально сложнее, но это тот же шаблон.

То же самое можно сделать с помощью ввода / вывода, я описал это в другом SO ответе .

"Магия", которая позволяет создавать "эффективные" функции:

  • Способ сделать тип эффективным. Например, включите B в B+E или Set(B). Я обозначу эффективную версию типа X как F(X).
  • Способ поднять функции: B -> F(C) в F(B) -> F(C). Позволяет составлять функции A -> F(B) и B -> F(C).
  • Ключевое слово return должно превратить обычное значение A в A+E или singleton Set(A). Так что это тип должен быть X -> F(X).

Структура, состоящая из этих трех, называется монадой. Монады позволяют описать эти побочные эффекты. Монада также может иметь некоторые специфические функции, например, монада исключений имеет throw, монада недетерминизма имеет fork, монада состояний имеет get/put, монада ввода-вывода имеет read/write и т. Д.

Мораль такова: если вы рассматриваете специальные эффекты, такие как рандомизация, исключения, недетерминизм, ввод / вывод, как часть результата функции, то каждая функция прозрачна по ссылкам, а функции в императивном программировании - это действительно математические функции, но с очень странными типами результатов, которые также описывают спецэффекты.Это подход, используемый чистыми функциональными языками, такими как Haskell.

1 голос
/ 08 марта 2015

Математические функции носят декларативный характер, т. Е. Они всегда имеют описания «что есть», тогда как функции в информатике являются императивными, то есть имеют описания «как».

Ссылка: Структура и интерпретация компьютерных программ.

0 голосов
/ 31 августа 2010

В математике функции не генерируют исключения. :)

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

В математике функция - это нечто очень специфическое и ничего более. Функция обычно описывается как «машина», которая принимает входные данные и выплевывает выходные данные. В то время как функции информатики принимают входные данные и выплевывают выходные данные, они не должны делать это с точным «один и тот же вход всегда дает один и тот же вывод», который требует математика (например, bool IsMyApplicationRunningInFullScreen () возвращает различные значения без входов на все).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...