我是 JS 新手,正在学习函数式编程,遇到了“引用透明”一词。另外,我发现了这个声明“引用透明性表明用它的值替换纯函数是安全的”。这是否意味着只要函数变热,使用 RT 可以让 JIT 编译器轻松地将函数替换为其返回值?真的吗?
问问题
538 次
2 回答
2
这是一个例子:
这是一个纯函数:它总是为相同的输入返回相同的输出
const even = x => x % 2 === 0;
让我们创建isTenEven()
它将检查是否10
是偶数:
const isTenEven = () => even(10);
既然我们保证这even(10) === true
将永远是真的,那么我们确实可以用一个值替换函数调用:
const isTenEven = () => true;
你的程序仍然可以工作。™</p>
even
但是,如果不是纯粹的,您将无法这样做!
这是一个愚蠢的例子:每月一次10
不再是偶数:
const even = x => (new Date()).getDate() === 15 ? false : x % 2 === 0;
也许你的程序除了isTenEven()
返回true
or之外false
,所以强迫它总是假设它会返回true
可能会导致意想不到的后果。
当然,在这种特殊情况下,我不确定这些后果会是什么,但你永远不知道......这正是重点。
于 2020-01-07T10:15:43.240 回答
1
是的,这正是 RT 的优势。编译器不仅可以内联函数,还可以将其调用替换为相应的返回值,即它可以消除常见的子表达式并根据特定规则重写代码,就像你可以重写数学中的公式一样。这种对程序进行推理的方式称为等式推理,对程序员也很有帮助。
但 RT 也允许使用其他优化技术,例如惰性求值。如果您想自动延迟对任意表达式的求值,直到实际需要它的结果,您需要保证无论何时实际求值,该表达式都会产生相同的结果。RT 给出了这个保证。
于 2020-01-07T10:08:50.760 回答