我是JS的新手,在学习函数式编程时,偶然发现了“引用透明性”这个术语。此外,我还发现了这样一句话:“引用透明性说明用纯函数的值替换它是安全的”。这是否意味着只要函数变热,RT的使用就会使JIT编译器很容易将函数替换为返回值?这是真的吗?
发布于 2020-01-07 18:15:43
下面是一个例子:
这是一个纯函数:对于相同的输入,它总是返回相同的输出
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
可能会导致意想不到的后果。
当然,在这种特殊情况下,我不确定这些后果会是什么,但你永远不会知道……这就是问题的关键。
发布于 2020-01-07 18:08:51
是的,这正是RT的一个优势。编译器不仅可以内联一个函数,还可以用相应的返回值替换它的调用,也就是说,它可以消除公共子表达式,并根据特定的规则重写代码,就像你可以重写数学公式一样。这种关于程序的推理方式被称为等式推理,这对程序员也很有帮助。
但是RT也支持其他优化技术,比如惰性求值。如果您希望自动延迟任意表达式的求值,直到实际需要其结果时,您需要保证此表达式在实际求值时都会产生相同的结果。RT给出了这一保证。
https://stackoverflow.com/questions/59624286
复制相似问题