首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数式编程中的引用透明性

函数式编程中的引用透明性
EN

Stack Overflow用户
提问于 2020-01-07 15:53:31
回答 2查看 472关注 0票数 3

我是JS的新手,在学习函数式编程时,偶然发现了“引用透明性”这个术语。此外,我还发现了这样一句话:“引用透明性说明用纯函数的值替换它是安全的”。这是否意味着只要函数变热,RT的使用就会使JIT编译器很容易将函数替换为返回值?这是真的吗?

EN

回答 2

Stack Overflow用户

发布于 2020-01-07 18:15:43

下面是一个例子:

这是一个纯函数:对于相同的输入,它总是返回相同的输出

代码语言:javascript
运行
复制
const even = x => x % 2 === 0;

让我们创建isTenEven(),它将检查10是否为偶数:

代码语言:javascript
运行
复制
const isTenEven = () => even(10);

既然我们保证even(10) === true总是真的,那么我们确实可以用一个值来替换函数调用:

代码语言:javascript
运行
复制
const isTenEven = () => true;

而且你的程序仍然可以工作。™

然而,如果even不是纯的,你就无法做到这一点!

这里有一个愚蠢的例子:每月一次的10将不再是偶数:

代码语言:javascript
运行
复制
const even = x => (new Date()).getDate() === 15 ? false : x % 2 === 0;

也许您的程序期望isTenEven()返回truefalse,因此强制它总是假设它将返回true可能会导致意想不到的后果。

当然,在这种特殊情况下,我不确定这些后果会是什么,但你永远不会知道……这就是问题的关键。

票数 2
EN

Stack Overflow用户

发布于 2020-01-07 18:08:51

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

但是RT也支持其他优化技术,比如惰性求值。如果您希望自动延迟任意表达式的求值,直到实际需要其结果时,您需要保证此表达式在实际求值时都会产生相同的结果。RT给出了这一保证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59624286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档