2016-01-18 2 views
4

Справочная прозрачность (Wikipedia):В чем разница между определениями ссылочной прозрачности и детерминированной функцией?

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

А также (Learn you some Erlang):

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

Детерминированные функции (MSDN):

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

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

+3

Откуда вы взяли эти определения? Процитируйте (и, возможно, ссылку) свой источник. – Bergi

+0

@Bergi: Я нашел это определение [«Функции, всегда возвращающие один и тот же результат для одного и того же параметра, называются ссылочной прозрачностью»] (http://learnyousomeerlang.com/introduction). Я думал, что это определение детерминированной функции. – Valeriy

+0

Источники из вопроса: https://en.wikipedia.org/wiki/Referential_transparency и https://msdn.microsoft.com/en-us/library/ms178091.aspx – Valeriy

ответ

2

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

2

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

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

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

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