次のように機能するには、js sum 関数が必要です。
sum(1)(2) = 3
sum(1)(2)(3) = 6
sum(1)(2)(3)(4) = 10
etc.
出来ないと聞きました。+
しかし、の前に追加すればsum
できると聞きました。のように+sum(1)(2)(3)(4)
。
これを行う方法のアイデアはありますか?
次のように機能するには、js sum 関数が必要です。
sum(1)(2) = 3
sum(1)(2)(3) = 6
sum(1)(2)(3)(4) = 10
etc.
出来ないと聞きました。+
しかし、の前に追加すればsum
できると聞きました。のように+sum(1)(2)(3)(4)
。
これを行う方法のアイデアはありますか?
あなたが何を望んでいるのか理解できたかどうかはわかりませんが、
function sum(n) {
var v = function(x) {
return sum(n + x);
};
v.valueOf = v.toString = function() {
return n;
};
return v;
}
console.log(+sum(1)(2)(3)(4));
これは、最後の呼び出しで空の括弧を閉じるキーとして使用する例です (私の最後のインタビューから):
合計(1)(4)(66)(35)(0)()
function sum(numberOne) {
var count = numberOne;
return function by(numberTwo) {
if (numberTwo === undefined) {
return count;
} else {
count += numberTwo;
return by;
}
}
}
console.log(sum(1)(4)(66)(35)(0)());
これは、ES6 Javascript の一般的な可変個引数カリー関数を使用したソリューション()
です。引数を呼び出すには final が必要であることに注意してください。
const curry = (f) =>
(...args) => args.length? curry(f.bind(0, ...args)): f();
const sum = (...values) => values.reduce((total, current) => total + current, 0)
curry(sum)(2)(2)(1)() == 5 // true
@rafael's answer のように()
使用して、必要のない別のものを次に示します。このように (またはまったく)使用することは、コードを読んでいる人にとって非常に混乱を招くように感じますが、それぞれ独自のものです。valueOf
valueOf
そのtoString
答えは不要です。内部的には、javascript が型変換を実行するとき、常に を呼び出すvalueOf()
前に呼び出しtoString()
ます。
// invokes a function if it is used as a value
const autoInvoke = (f) => Object.assign(f, { valueOf: f } );
const curry = autoInvoke((f) =>
(...args) => args.length? autoInvoke(curry(f.bind(0, ...args))): f());
const sum = (...values) => values.reduce((total, current) => total + current, 0)
curry(sum)(2)(2)(1) + 0 == 5 // true
以下の機能を利用できます
function add(num){
add.sum || (add.sum = 0) // make sure add.sum exists if not assign it to 0
add.sum += num; // increment it
return add.toString = add.valueOf = function(){
var rtn = add.sum; // we save the value
return add.sum = 0, rtn // return it before we reset add.sum to 0
}, add; // return the function
}
関数はオブジェクトであるため、プロパティを追加できます。これは、アクセスされたときにリセットされます。