函数式编程中的引用透明度



我是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()返回truefalse,所以强迫它总是假设它会返回true可能会导致意想不到的后果。

当然,在这种特殊情况下,我不确定这些后果会是什么,但你永远不知道......这正是重点。

是的,这正是RT的优势。编译器不仅可以内联函数,还可以将其调用替换为相应的返回值,也就是说,它可以消除常见的子表达式并根据特定规则重写代码,就像您可以在数学中重写公式一样。这种对程序的推理方式称为等式推理,对程序员也非常有帮助。

但是RT也允许其他优化技术,比如惰性求值。如果要自动将任意表达式的计算延迟到实际需要其结果的程度,则需要保证无论何时实际计算此表达式,它都会产生相同的结果。RT提供此保证。

最新更新