41

次のように機能するには、js sum 関数が必要です。

sum(1)(2) = 3
sum(1)(2)(3) = 6
sum(1)(2)(3)(4) = 10 
etc.

出来ないと聞きました。+しかし、の前に追加すればsumできると聞きました。のように+sum(1)(2)(3)(4)
これを行う方法のアイデアはありますか?

4

17 に答える 17

78

あなたが何を望んでいるのか理解できたかどうかはわかりませんが、

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));

Jsフィドル

于 2011-04-29T13:57:11.653 に答える
32

これは、最後の呼び出しで空の括弧を閉じるキーとして使用する例です (私の最後のインタビューから):

合計(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)());

于 2016-02-28T21:09:59.467 に答える
4

これは、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 のように()使用して、必要のない別のものを次に示します。このように (またはまったく)使用することは、コードを読んでいる人にとって非常に混乱を招くように感じますが、それぞれ独自のものです。valueOfvalueOf

その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
于 2019-02-20T15:12:04.630 に答える
0

以下の機能を利用できます

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
}

関数はオブジェクトであるため、プロパティを追加できます。これは、アクセスされたときにリセットされます。

于 2015-02-12T10:03:30.360 に答える