Ссылочная прозрачность в функциональном программировании - PullRequest
3 голосов
/ 07 января 2020

Я новичок в JS, изучал функциональное программирование и столкнулся с термином "ссылочная прозрачность". Кроме того, я нашел это утверждение: «Ссылочная прозрачность говорит, что безопасно заменить чистую функцию ее значением». Означает ли это, что использование RT облегчает компилятору JIT замену функции ее возвращаемым значением, пока функция нагревается? Это правда?

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Вот пример:

Это чистая функция: она всегда будет возвращать один и тот же вывод для одного и того же ввода

const even = x => x % 2 === 0;

И давайте создадим isTenEven(), который будет проверять, не влажнее ли 10 - четное число или нет:

const isTenEven = () => even(10);

Поскольку мы гарантируем, что even(10) === true будет всегда истинным, мы можем действительно заменить вызов функции значением:

const isTenEven = () => true;

А ваша программа все равно будет работать.

Однако вы не сможете этого сделать, если even не будет чистым!
Вот глупый пример: раз в месяц 10 больше не будет четным числом:

const even = x => (new Date()).getDate() === 15 ? false : x % 2 === 0;

Возможно, ваша программа за исключением isTenEven() возвращает либо true или false, поэтому всегда предполагать, что он вернется true может привести к неожиданным последствиям.

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

1 голос
/ 07 января 2020

Да, это именно преимущество RT. Компилятор может не только встроить функцию, но и заменить ее вызовы соответствующим возвращаемым значением, то есть он может исключить общие подвыражения и переписать код в соответствии с указанными c правилами, как вы можете переписывать формулы в математике. Такой способ рассуждения о программе называется эквациональным рассуждением и также очень полезен для программиста.

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

...