- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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/
我是一名优秀的程序员,十分优秀!