機能コードがスタックセーフであると思うとき


再帰は機能的な原始であり、したがって、我々はそれを避けるようにしようとする.最終的には、それは変装の厄介な命令的なループにすぎないからである.FPでは通常折り畳みを使用し、折り畳みが十分に表現力がない場合にのみ再帰に頼る.
JavaScriptでは、さらにスタックの安全性を気にする必要があります.したがって、各タイプに適した特定のトランポリンを用いた折り畳みを実施するためのスマートな戦略である
// Foldable

const arrFold = f => init => xs => {
  let acc = init;

  for (let i = 0; i < xs.length; i++) // trampoline
    acc = f(acc) (xs[i], i);

  return acc;
};

// identity

const id = x => x;

// function composition

const comp = f => g => x => f(g(x));

const compn = arrFold(comp) (id); // variadic

// MAIN

const inc = x => x + 1;

compn([inc, inc, inc, inc, inc]) (0); // 5
run code
あなたはスタック安全なトランポリンとして実装されているarrFoldで自分自身を安全と考えることができます.ただし、
// MAIN

const inc = x => x + 1;

const xs = Array(1e5).fill(inc);

const foo = compn(xs); // still okay

foo(0); // stack overflow
run code
二つの関数を新しい関数の記述に結合することを意味します.したがって、繰り返し実行するのを待っている説明の巨大な説明を構築します.
それについて何ができるか我々はその構成をばらばらにする方法が必要だ.我々はすでにトランポリンを使用している.適切なツールのようです.
// trampoline for deferred function call trees

const postRec = f => (...args) => {
  let step = f(...args);

  while (step.tag !== "Base")
    step = f(...step.args);

  return init => {
    let {f, x} = step.x(init);

    while (step = f(x)) {
      if (step && step.tag === "Call") {
        step = step.f(step.x);

        if (step && step.tag === "Call") {
          ({f, x} = step);
          continue;
        }

        else break;
      }

      else break;
    }

    return step;
  }
};

const Base = x =>
  ({tag: "Base", x});

const Call = f => x =>
  ({tag: "Call", f, x});

const Step = (...args) =>
  ({tag: "Step", args});

// function composition

const comp = f => g => x => f(g(x));

const compn = xs => // variadic
  postRec((i, acc) =>
    i === xs.length
      ? Base(acc)
      : Step(i + 1, Call(comp(acc) (xs[i]))))
        (0, Call(id));

// MAIN

const inc = x => x + 1;

const xs = Array(1e5).fill(inc);

compn(xs) (0); // 100000
run codepostRecは美しさではない.それはすべてのその醜い操作意味論を明らかにする.JavaScriptは、美しさについてでなく、物事を成し遂げるために、私は推測します.
AAWAWAY、FPにおいて、我々はしばしば巨大な延期された機能呼び出し木をつくる計算の記述に対処しなければなりません.我々の処分で専門トランポリンを持つことは、我々がJSでFPについて真剣になるのを許します.
あなたがJSのFPについてもっと知りたいならば、Githubの上で私のコースを見てください.