js 函数通过乘法器数组重复调用

js function repeatedly invokes through an array of multipliers

提问人:imparante 提问时间:6/17/2023 最后编辑:imparante 更新时间:6/20/2023 访问量:82

问:

我遇到一个错误:.我正在考虑咖喱和部分应用。我希望函数通过乘法器数组正确调用。有人可以解释一下我的功能中缺少什么吗?Uncaught TypeError TypeError: multipliers.reduce(...) is not a functionmultiplymultiply

乘以整数的 multiply 函数,但以一种特殊的方式。 可以重复调用函数的输出,直到您调用它时不带参数。 例如,应返回 . 我正在使用一个辅助函数,该函数获取所有乘数,然后如上所述将它们传递给。multiply(3)(4)(5)()3 * 4 * 5 = 60solution(multipliers)multiply

输入

multipliers: [3, 4, 5]

输出

60

法典

function multiply(x) {
    return function(y) { // anonymous function
        return function(z) { // anonymous function
            return x * y * z;
        }
    }
}

// this function lets you invoke something like multiply(3)(4)(5)() with dynamic arguments
function solution(multipliers) {
    return (multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null))();
}

console.log(solution([3, 4, 5]));
JavaScript 乘法 currying partial-application

评论

1赞 Bergi 6/17/2023
multiply(3)(4)(5)返回。无需额外服务。无需额外服务。您已经通过声明嵌套函数来调整操作。3 * 4 + 5()solution
2赞 Bergi 6/17/2023
你不能用可变参数(=接受任意数量的参数)函数进行咖喱。不要试图混合它们。
0赞 imparante 6/17/2023
这个想法是输入是一个乘数组。这就是我使用该功能的原因。solution
0赞 Aadit M Shah 6/17/2023
您的函数还执行加法,这不是您所描述的。例如,您描述的应该返回 .但是,当应用时,您的函数将返回 .此外,正如你所看到的,它不需要任意数量的输入。相反,它总是恰好需要 3 个输入。所以,你的问题不一致。请阐明您实际想做什么。multiplymultiply(2)(3)(5)()2 * 3 * 5 = 60multiplymultiply(2)(3)(5)2 * 3 + 5 = 17
0赞 imparante 6/20/2023
抱歉,我已经更新了我的实现以匹配示例。return x * y * z

答:

0赞 Sharan Balakrishnan 6/17/2023 #1

在对数组调用数组方法之前,必须将所有参数推送到数组中。或者,您可以使用函数中的参数参数来获取所有参数。

您能分享一下该函数是如何调用的吗?

评论

0赞 imparante 6/17/2023
刚刚使用我正在使用的函数调用编辑了代码示例。
0赞 imparante 6/20/2023
console.log(solution([3, 4, 5]));
0赞 Bergi 6/17/2023 #2

使用该函数作为调用的初始值,并删除最终值:multiplyreduce()

function solution(multipliers) {
    return multipliers.reduce((prev, arg) => prev(arg), multiply);
}
console.log(solution([3, 4, 5]));

function multiply(x) {
    return function(y) {
        return function(z) {
            return x * y + z;
        }
    }
}

评论

0赞 imparante 6/20/2023
谢谢,我想保持解决方案功能不做任何更改,只更新.最内层的回报是 。我刚刚更新了我的实现以匹配示例。multiply functionreturn x * y * z
1赞 Bergi 6/20/2023
@imparante 当然,你可以用 代替,但实际上你不应该。你的功能是错误的,过于复杂,你应该修复它return x * y * z;return function() { return x * y * z; };solution
0赞 Aadit M Shah 6/17/2023 #3

函数定义不正确。如果要计算,则需要按如下方式定义函数。multiplymultiply(3)(4)(5)()60multiply

// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
  typeof y === "undefined" ? x : getMultiply(x * y);

// 1 is the identity element of multiplication
const multiply = getMultiply(1);

console.log(multiply(3)(4)(5)()); // 60

正确定义后,可以按如下方式定义。multiplysolution

// x is required, y is optional, both are numbers
const getMultiply = (x) => (y) =>
  typeof y === "undefined" ? x : getMultiply(x * y);

// 1 is the identity element of multiplication
const multiply = getMultiply(1);

const solution = (multipliers) =>
  multipliers.reduce((f, x) => f(x), multiply)();

console.log(solution([3, 4, 5])); // 60

评论

0赞 imparante 6/20/2023
谢谢,我想保持解决方案功能不做任何更改,只更新multiply function
0赞 M0nst3R 6/20/2023 #4

您正在以 IIFE 的身份调用调用。这是行不通的,因为在代码中调用 reduce 的结果不是一个函数,而是一个数字。multipliers.reduce(...)

在你提供的代码中,你基本上写道:

function solution(multipliers) {
  return (60)(); // 60 here being the result of calling the reduce
}

这解释了您收到的错误。

您需要做的就是省略 IIFE 调用。您的函数将变为:

function solution(multipliers) {
    return multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null);
}

最后,我建议在这里或这个问题中查看其他一些答案,以便更好地实现您的函数,使其更加通用。multiply

-1赞 imparante 6/20/2023 #5

由于 @ghassen-louhaichi 链接到一个相关问题,我只能使用 currying 修改函数:创建一个具有不确定连续调用次数的函数multiply

function multiply(x) {
    return function() {
        if (arguments.length == 0) {
            return x;
        } else {
            return multiply(x * arguments[0]);
        }
    }
}

// this function lets you invoke something like multiply(3)(4)(5)() with dynamic arguments
function solution(multipliers) {
    return (multipliers.reduce((prev, arg) => {
        if (prev) {
            return prev(arg);
        }
        return multiply(arg);
    }, null))();
}

console.log(solution([3, 4, 5]));

对 的第一次调用返回内部函数。根据传递给内部函数的参数数量,它按原样返回 的参数值,或者再次调用“乘以”更新的运行总数(从而再次返回要再次调用的内部函数)。multiplymultiply

(此实现的)限制是您必须进行最终调用,而没有参数才能获得最终值。