gpt4 book ai didi

javascript - JavaScript 中的函数组合

转载 作者:行者123 更新时间:2023-12-02 06:27:51 25 4
gpt4 key购买 nike

我知道这是很有可能的,因为我的 Haskell friend 们似乎能够在睡梦中做这种事情,但我不能全神贯注于 JS 中更复杂的函数组合。

比如说,你有这三个函数:

const round = v => Math.round(v);

const clamp = v => v < 1.3 ? 1.3 : v;

const getScore = (iteration, factor) =>
iteration < 2 ? 1 :
iteration === 2 ? 6 :
(getScore(iteration - 1, factor) * factor);

在这种情况下,假设 iteration 应该是一个整数,因此我们希望将 round() 应用于该参数。想象一下 factor 必须至少为 1.3,因此我们希望将 clamp() 应用于该参数。

如果我们将 getScore 分成两个函数,这似乎更容易组合:

const getScore = iteration => factor =>
iteration < 2 ? 1 :
iteration === 2 ? 6 :
(getScore(iteration - 1)(factor) * factor);

执行此操作的代码可能如下所示:

const getRoundedClampedScore = compose(round, clamp, getScore);

但是 compose 函数是什么样的呢? getRoundedClampedScore 是如何调用的?或者这是非常错误的?

最佳答案

compose 函数应该将要组合的核心函数,使用剩余参数将其他函数放入数组,然后返回调用的函数数组中第 i 个函数,第 i 个参数:

const round = v => Math.round(v);

const clamp = v => v < 1.3 ? 1.3 : v;

const getScore = iteration => factor =>
iteration < 2 ? 1 :
iteration === 2 ? 6 :
(getScore(iteration - 1)(factor) * factor);

const compose = (fn, ...transformArgsFns) => (...args) => {
const newArgs = transformArgsFns.map((tranformArgFn, i) => tranformArgFn(args[i]));
return fn(...newArgs);
}

const getRoundedClampedScore = compose(getScore, round, clamp);

console.log(getRoundedClampedScore(1)(5))
console.log(getRoundedClampedScore(3.3)(5))
console.log(getRoundedClampedScore(3.3)(1))

关于javascript - JavaScript 中的函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51414412/

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