3

私は最近 JS の学習を始めましたが、関数型言語の領域に飛び込むのはこれが初めてです。

npm モジュールで「トランポリン」の演習を行っていたfunctional-javascript-workshopところ、自分のソリューションと公式のソリューションの間に興味深い違いがありました。どちらも完全に正常に動作しますが、実際の違いが正確に何であるかについては途方に暮れています。私は自分のソリューションをかなりよく理解していますが、他のソリューションも機能する理由を正確には理解していません。

私の解決策

function repeat(op, num) {
  var _repeat = function() {
    if (num <= 0) return;
    op();
    return repeat(op, --num);
  };

  return _repeat;
}

function trampoline(f) {
  while (f instanceof Function) {
    f = f();
  }
  return f;
}

module.exports = function(op, num) {
  return trampoline(repeat(op, num));
};

公式ソリューション

function repeat(operation, num) {
  return function() {
    if (num <= 0) return
    operation()
    return repeat(operation, --num)
  }
}

function trampoline(fn) {
  while(fn && typeof fn === 'function') {
    fn = fn()
  }
}

module.exports = function(operation, num) {
  trampoline(function() {
    return repeat(operation, num)
  })
}

具体的には、最後の部分に興味があります-公式のソリューションは、単に渡すのではなく、匿名関数を作成するのはなぜrepeatですか?

4

2 に答える 2

1

本当に理由はありません。

トランポリンがすべての呼び出しを行うことを除いて、あなたのバージョンでは の最初の呼び出しはトランポリンのrepeat外で行われます。これはよりクリーンと見なされる可能性があり、trampolineより洗練された場合 (たとえば、すべての実行を try-catch でラップする場合) に実際の違いが生じる可能性があります。

于 2014-11-17T23:53:42.120 に答える