2017-02-05 15 views
0

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

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

Например, вот an entry from the Haskell Wiki:

Haskell является чистым языком, что означает, что результат любого вызова функции полностью определяется своими аргументами. Псевдофункции , подобные rand() или getchar() в C, которые возвращают разные результаты по каждому вызову , просто невозможно записать в Haskell. Более того, функции Haskell не могут иметь побочных эффектов, а это означает, что они не могут влиять на любые изменения в «реальном мире», такие как смена файлов, запись на экран , печать, отправка данных по сети и т. Д. на. Эти два ограничения означают, что любой вызов функции может быть заменен на результатом предыдущего вызова с теми же параметрами, а язык гарантирует, что все эти перестановки не изменят результат программы !

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

x(a)->a+3 

y(a)->a*3 


z(a)->x(y(a)) 

w(a)->y(x(a)) 

Теперь, если мы выполняем z и w, мы получаем:

z(5) //gives 3*5+3=18 

w(5) //gives (5+3)*3=24 

это так, Я думаю, что неправильно понял обещанную им гарантию. Может ли кто-нибудь объяснить это мне?

ответ

8

При сравнении x(y(a)) к y(x(a)), эти два выражения не эквивалентны, так как x и y не вызывается с теми же аргументами в каждом. В первом выражении вызывается x с аргументом y(a) и y вызывается с аргументом a. Принимая во внимание, что во втором y вызывается x(a), а не a, поскольку его аргумент и x вызывается с a, а не y(a). Итак: разные аргументы (возможно) разные результаты.

Когда люди говорят о том, что порядок не имеет значения, они имеют в виду, что в следующем коде:

a = f(x) 
b = g(y) 

вы можете переключить определение a и b, не затрагивая их значения. То есть не имеет значения, вызывается ли f до g или наоборот.Это явно не относится к следующему коду:

a = getchar() 
b = getchar() 

При переключении a и b здесь, их значения включаются также, потому что getchar возвращает (возможно) различный характер каждый раз, что это называется. Таким образом, чисто функциональный язык не может иметь такую ​​функцию, как getchar.

+0

спасибо, я думаю, я только что взял их гарантию до крайности :) – Tal

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

  • Нет связанных вопросов^_^