gpt4 book ai didi

JavaScript 柯里化(Currying)函数

转载 作者:行者123 更新时间:2023-11-28 12:13:22 25 4
gpt4 key购买 nike

我的 JavaScript 编程类(class)中的一项作业遇到问题。

作业:

Create a function called "calculate" which expects three functions as parameters and when called returns one of those functions as a result.

Everytime you call

let result = calculate(add, subtract, multiply)(1,3)

it should return a different result.

我尝试了不同的方法并得到了不同的错误,例如计算不是函数或乘法未定义。

这是我迄今为止尝试过的:

function add(num1, num2){
return num1 + num2;
}

function subtract(num1, num2){
return num1 - num2;
}

function multiply(num1, num2){
return num1 * num2;
}

function calculate(add, subtract, multiply){

let randNum = Math.floor(Math.random() * 3) + 1

switch(randNum){
case 1:
let add = add(num1, num2)
break;

case 2:
let subtract = subtract(num1, num2);
break;

case 3:
let multiply = multiply(num1, num2);
break;

}

}

let result = calculate(add(2,4), subtract(2,4), multiply(2,4))
console.log(result);

我对柯里化(Currying)做了一些研究,但我看不出我做错了什么。任何帮助将不胜感激。

最佳答案

这对于柯里化(Currying)教学来说并不是一个很好的例子。我认为讲师/类(class)在这里试图传达的是,当你这样做时:

let result = calculate(add, subtract, multiply)(1,3)

您正在调用一个函数( calculate ),该函数返回一个函数(您传递给它的三个函数之一,我猜是随机选择的,尽管分配不清楚),然后您正在调用该函数(通过使用(1,3) 关于 calculate(...) 调用的结果。

calculate可以是一行:

function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}

或者在 ES5 中:

function calculate() {
return arguments[Math.floor(Math.random() * arguments.length)];
}

实例:

function add(num1, num2){
return num1 + num2;
}

function subtract(num1, num2){
return num1 - num2;
}

function multiply(num1, num2){
return num1 * num2;
}

function calculate(...fns) {
return fns[Math.floor(Math.random() * fns.length)];
}

let result = calculate(add, subtract, multiply)(1,3);
console.log(result);

<小时/>

教授柯里化(Currying)的一个更有用的例子是:

let result = calculate(add, subtract, multiply)(1)(3);
// ----------------------------------------------^^

请注意,我们正在调用 calculate 的结果与 1 ,然后使用 3 调用 that 的结果。然后,calculate需要将它选择的函数包装在另一个收集 1 的函数中然后等待被 3 调用:

function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => {
return (b) => {
return fn(a, b);
};
};
}

或者更简洁,但不太清楚:

function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}

实例:

function add(num1, num2){
return num1 + num2;
}

function subtract(num1, num2){
return num1 - num2;
}

function multiply(num1, num2){
return num1 * num2;
}

function calculate(...fns) {
const fn = fns[Math.floor(Math.random() * fns.length)];
return (a) => (b) => fn(a, b);
}

let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);

calculate 返回的函数,当被调用时,会记住 a并返回一个新函数;该函数在调用时会得到 b并调用fn(a, b)得到结果。

该示例预先选择函数,但也可以在最后选择它:

function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}

实例:

function add(num1, num2){
return num1 + num2;
}

function subtract(num1, num2){
return num1 - num2;
}

function multiply(num1, num2){
return num1 * num2;
}

function calculate(...fns) {
return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}

let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);

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

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