我是JS的新手,正在学习函数式编程,并遇到了"引用透明度"一词。另外,我发现了这样一句话"引用透明度说用它的值替换纯函数是安全的"。这是否意味着只要函数变热,使用 RT 就可以轻松地将函数替换为其返回值?这是真的吗?
下面是一个示例:
这是一个纯函数:它将始终为相同的输入返回相同的输出
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
可能会导致意想不到的后果。
当然,在这种特殊情况下,我不确定这些后果会是什么,但你永远不知道......这正是重点。
是的,这正是RT的优势。编译器不仅可以内联函数,还可以将其调用替换为相应的返回值,也就是说,它可以消除常见的子表达式并根据特定规则重写代码,就像您可以在数学中重写公式一样。这种对程序的推理方式称为等式推理,对程序员也非常有帮助。
但是RT也允许其他优化技术,比如惰性求值。如果要自动将任意表达式的计算延迟到实际需要其结果的程度,则需要保证无论何时实际计算此表达式,它都会产生相同的结果。RT提供此保证。