javascript - 如果我的值需要根据之前的值进行更新,我该如何编写纯函数式代码?
问题描述
根据我对 FRP 的理解,我们应该使用纯函数,这意味着输入不会发生变异。如何创建一个依赖于先前值的纯函数?
例如,我有一个每次按空格键时都会水平移动的对象。这意味着需要根据之前的 x 值更新 x 值。
最初,对象从 x -> 0 开始。按下空格键,x -> 1。再次按下空格键,x -> 2。
如果我们不允许像这样(javascript 代码)改变 x 的值,
let x = 0;
function set_x() {
x += 1;
}
我的程序如何记住 x 的先前值是什么?
解决方案
通常,FRP 通过使用高阶函数从另一个流创建一个流来工作。当您需要流的前一个值时,将调用您想要的函数fold
,reduce
或scan
。f(p, x)
它接受一个事件流、一个起始值和函数,并生成另一个以起始值开头的流,然后p
每次x
出现原始流上的事件。
例如,在 Bacon.JS 中,您想要的方法被调用scan
(fold
也存在,但只发出最终值,所以在这里不做我们想要的),您的代码可能如下所示:
const numberOfSpacePresses = spacePressEvents.scan(0, (count, _) => count + 1);
一些库也可能已经有一个名为的函数或方法count
可以满足您的需求,因此您只需编写spacePressEvents.count()
.
推荐阅读
- sql-server - 从开发环境切换到暂存环境时出现错误 - ASP.Net Core MVC
- c# - 启动dll时C#环境堆栈溢出
- javascript - 将 Unix 时间戳转换为日期时间字符串
- c# - 使用 Windows 窗体应用程序在不打开打印对话框的情况下打印 pdf 文件
- python - 张量流错误:从分类列组成交叉列
- apache-kafka - 使用 Kafka Streams DSL 多次将同一主题用作源
- node.js - 如何修改mongodb/mongoose中私有路由的schema方法?
- c++ - 如何设置自定义小部件的背景颜色和边框宽度?
- android - SSL 证书固定在 Android 9 上不再工作
- vba - 收到电子邮件时运行的 Outlook 脚本仅在我将新邮件传输给自己时才有效