Я начал читать некоторые документы 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
это так, Я думаю, что неправильно понял обещанную им гарантию. Может ли кто-нибудь объяснить это мне?
спасибо, я думаю, я только что взял их гарантию до крайности :) – Tal