2015-07-14 4 views
2

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

Из этого другого ответа на переполнение стека: https://stackoverflow.com/a/23290/1276021, «Функциональный язык» (в идеале) позволяет вам написать «математическую функцию».

Но, как и в математических функциях, f(g(x)) !== g(f(x)) - значение, порядок выполнения вопроса.

Похоже, я ошибался в понимании концепции, что «порядок исполнения не определен». Где я ошибаюсь?

ответ

3

f(g(x)) !== g(f(x)) - значение, порядок выполнения вопрос.

Нет, это разные выражения/программы, а не только разные порядки исполнения.

Похоже, я был неправ в понимании концепции, что «порядок исполнения не определен»

Правильным, более многословным утверждение было бы "порядок evaluation из частей выражения не имеет значения "(и всегда приведет к такому же результату). Это означает, что такой функциональный язык не имеет side effects и referential transparency - два очень важных свойства для доказательств, которые также имеют «математические» функции.

Если мы определим две функции

f(x) = x*3 
g(y) = y+1 

, а затем попытаться оценить выражение f(g(1)), это не имеет значения, первый ли мы

f(g(1)) 
= f(1+1) 
= f(2) 
= 2*3 
= 6 

или

f(g(1)) 
= g(1)*3 
= (1+1)*3 
= 2*3 
= 6 

Мы всегда приходят к 6, независимо от того, какую из функций мы применяем в первую очередь.

2

Да, порядок выполнения оставлен до компилятора и вам программист не имеет значения.

Но что входные данные для каждой функции являются является важно:

  • е (г (х)) означает, что результат вызова п с результатом г (х)
  • г (е (х)) означает, что результат вызова г с результатом F (X)

Рассмотрим следующий пример:

a(b(x)) + b(x) + c(b(x)) 

Компилятор решит сначала выяснить результат b(x), а затем использовать этот результат в вызовах функций a и c. Но очень плохо оптимизированный компилятор может решить выяснить b(x), а затем позвонить a, после чего затем выведите b(x), а затем выведите c(b(x)). В конечном итоге они оба придумают один и тот же ответ, так как вы программист, порядок исполнения не имеет значения. В большинстве случаев хорошо написанный компилятор будет определять лучший порядок исполнения далеко далеко лучше, чем вы могли бы вручную, используя императивный язык, особенно когда все становится сложным, и поэтому лучше не думать о порядке исполнения, скорее оставить это как деталь реализации для компилятора для решения.

2

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

Возьмите эти 2 функции

f(x) = x^2 
g(x) = 2x - 4 

принимают следующий состав f(g(x)). Если оценивать f первый:

F = f(g(x)) = (g(x))^2 

Наш новый F еще действует функция в математике, как это было бы в функциональном программировании.

Тогда, если мы оцениваем g(x) к g(3) мы получаем:

g(3) = 2 * 3 - 4 = 2 

Затем мы можем оценить F

F = (2)^2 = 4 

Порядок оценки не имеет значения.

Смежные вопросы