gpt4 book ai didi

javascript - 记住柯里化(Currying)函数

转载 作者:行者123 更新时间:2023-12-03 02:06:36 26 4
gpt4 key购买 nike

const f = (arg1) => (arg2) => { /* returns something */ }

是否可以记住 f 的两个参数,即:

f(1)(2);
f(1)(3); // Cache not hit
f(4)(2); // Cache not hit
f(1)(2); // Cache hit

最佳答案

您可以将 Map 作为缓存,并为所有以下参数采用嵌套映射。

此缓存适用于任意数量的参数,并重用之前调用的值。

它的工作原理是采用柯里化(Currying)函数和可选的Map。如果未提供映射,则会创建一个新映射,用作返回闭包或最终结果的所有其他调用的基础缓存。

内部函数采用单个参数并检查该值是否在映射中。

  • 如果没有,则调用柯里化(Currying)函数并检查返回值

    • 如果是函数,则在该函数上创建一个新的闭包和一个新的映射,

    • 如果没有函数获取结果,

    作为 map 新元素的值。

  • 最后从 map 中返回值。

const cached = (fn, map = new Map()) => arg => {
const inCache = map.has(arg);
const hint = inCache ? 'in cache' : 'not in cache';

console.log(arg, hint);

if (!inCache) {
const value = fn(arg);
const result = typeof value === 'function' ? cached(value, new Map()) : value;

map.set(arg, result);
}

return map.get(arg);
};

const f = a => b => c => a * b * c; // the original curried function
const g = cached(f); // its cached variant

console.log(g(1)(2)(5)); // not not not 10
console.log(g(1)(3)(4)); // in not not 12
console.log(g(4)(2)(3)); // not not not 24
console.log(g(1)(2)(6)); // in in not 12
console.log(g(4)(2)(3)); // in in in 24
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 记住柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077182/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com