我现在正在阅读Frisby教授的“函数式编程指南”,我想知道如何才能进行纯提取,我看到了这段代码在书里
const pureHttpCall = memoize((url, params) => () => $.getJSON(url, params));
并说
有趣的是,我们实际上并不进行http调用,而是返回一个在调用时会这样做的函数。这个函数是纯的,因为给定相同的输入,它总是返回相同的输出:这个函数将使特定的http调用给定url和params。
这给我留下了一些困惑,我不明白为什么pureHttpCall
现在是纯的,并且仍然有不纯的底层代码(抓取部分)。
那么,我在这里遗漏了什么,这使得代码纯和functional
发布于 2022-03-08 17:23:33
使该功能纯净的原因是:
memoize( ... )
记忆是一种特殊的缓存。您可能熟悉缓存。也就是说,将昂贵操作的结果存储在变量中,如果该变量已经存在,则返回该变量的值,而不是执行昂贵的操作。追忆就是这样。
回传和缓存的主要区别在于回传是一个永久缓存--最常用的缓存算法都有一个失效过程:它可以是基于时间的(如果它比x
更旧的话删除缓存)、基于计数的缓存(如果缓存的x
项超过了缓存的话就删除缓存)、基于内存的缓存(如果缓存使用的内存大于x
兆字节的话就删除缓存)等等。因此,昂贵的操作只执行一次。
一个操作只执行一次这一事实导致对pureHttpCall
的每一次调用都是保证的返回相同的结果。这意味着该函数现在是纯的。
是的,如果你回忆录的话,你也可以对Math.random()
做同样的事情,每次调用pureRandom
都会返回完全相同的号码。这将使pureRandom
成为纯的,因为它总是返回相同的结果。我个人不认为这是“随机”函数。
memoize
的一个非常简单的实现可以是这样的:
function memoize (fn) {
let cache;
return function () {
if (cache === undefined) {
cache = fn();
}
return cache;
}
}
为了清晰起见,上面的代码是100%同步的,但是可以编写回忆录函数的异步版本。
发布于 2022-03-09 02:38:07
据我所知,作者在这里争辩说,由于增加了缓存层,该函数现在有了可预测的结果:
一旦完成了输入参数的组合,该组合将始终返回第一次生成的相同结果。
因此,如果您拔掉以太网电缆并执行pureHttpCall("http://google.com")
,您将得到一个错误响应。如果你现在回复你的电缆,那么pureHttpCall("http://google.com")
仍然会产生同样的错误,你第一次得到。
但我认为我不同意,因为这里有一个隐含的依赖关系。函数在第一次调用时仍然取决于环境。如果你在拔出你的以太网电缆和回覆你的以太网电缆之间重新启动你的程序,你会得到不同的结果。
https://stackoverflow.com/questions/71402312
复制