機能コードがスタックセーフであると思うとき
12416 ワード
再帰は機能的な原始であり、したがって、我々はそれを避けるようにしようとする.最終的には、それは変装の厄介な命令的なループにすぎないからである.FPでは通常折り畳みを使用し、折り畳みが十分に表現力がない場合にのみ再帰に頼る.
JavaScriptでは、さらにスタックの安全性を気にする必要があります.したがって、各タイプに適した特定のトランポリンを用いた折り畳みを実施するためのスマートな戦略である
あなたはスタック安全なトランポリンとして実装されている
二つの関数を新しい関数の記述に結合することを意味します.したがって、繰り返し実行するのを待っている説明の巨大な説明を構築します.
それについて何ができるか我々はその構成をばらばらにする方法が必要だ.我々はすでにトランポリンを使用している.適切なツールのようです.
AAWAWAY、FPにおいて、我々はしばしば巨大な延期された機能呼び出し木をつくる計算の記述に対処しなければなりません.我々の処分で専門トランポリンを持つことは、我々がJSでFPについて真剣になるのを許します.
あなたがJSのFPについてもっと知りたいならば、Githubの上で私のコースを見てください.
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の上で私のコースを見てください.
Reference
この問題について(機能コードがスタックセーフであると思うとき), 我々は、より多くの情報をここで見つけました https://dev.to/iquardt/when-you-think-your-functional-code-is-stack-safe-3edfテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol