首页 > 解决方案 > 如果我的值需要根据之前的值进行更新,我该如何编写纯函数式代码?

问题描述

根据我对 FRP 的理解,我们应该使用纯函数,这意味着输入不会发生变异。如何创建一个依赖于先前值的纯函数?

例如,我有一个每次按空格键时都会水平移动的对象。这意味着需要根据之前的 x 值更新 x 值。

最初,对象从 x -> 0 开始。按下空格键,x -> 1。再次按下空格键,x -> 2。

如果我们不允许像这样(javascript 代码)改变 x 的值,

let x = 0;
function set_x() {
    x += 1;
  }

我的程序如何记住 x 的先前值是什么?

标签: javascriptfunctional-programming

解决方案


通常,FRP 通过使用高阶函数从另一个流创建一个流来工作。当您需要流的前一个值时,将调用您想要的函数foldreducescanf(p, x)它接受一个事件流、一个起始值和函数,并生成另一个以起始值开头的流,然后p每次x出现原始流上的事件。

例如,在 Bacon.JS 中,您想要的方法被调用scanfold也存在,但只发出最终值,所以在这里不做我们想要的),您的代码可能如下所示:

const numberOfSpacePresses = spacePressEvents.scan(0, (count, _) => count + 1);

一些库也可能已经有一个名为的函数或方法count可以满足您的需求,因此您只需编写spacePressEvents.count().


推荐阅读