2

Javascript での再帰に関する別の SO の質問への回答に出くわしました。これは、ES6 のファット アローを使用して、Y コンビネータを使用して ES6 で非常に簡潔なフォームを作成し、それを使用するのがうまくいくと思いました- その後 15 分ほどかかります。後でうーん、多分そうではない.

私はいくつかの Haskell/Idris の講演に参加し、以前にいくつかのコードを実行したことがあり、標準の JS に精通しているので、これを理解できることを望んでいましたが、単純な「n再帰を実行して返す」方法がよくわかりません。 " 行くはずであり、減分カウンターを実装する場所。

nDOM 要素のth親ノードの取得を簡単にしたかっただけで、このような単純なアプリケーションの例よりも詳細な説明ガイドがあるようです。

私が最初に見た例は次のとおりです

const Y = a => (a => a(a))(b => a(a => b(b)(a)));

この最近の回答は次のとおりです。

const U = f => f (f)
const Y = U (h => f => f (x => h(h)(f)(x)))

...これは、内部関数が何であるかの例といくつかの出力例で示されていますが、U-コンビネーターを導入しても、これを明確にするのに実際には役立ちません。

最初の例でbは、私の場合に何が起こるかを理解することはできませんa。親ノードを返すために1 つの関数が必要であることはわかっています。

const par = function(node) {
  return node.parentNode;
}

私は以下を思いついた:

function RecParentNode(base_node, n) {
  // ES6 Y-combinator, via: https://stackoverflow.com/a/32851197/2668831
  // define immutable [const] functions `Y` and `fn` [`fn` uses `Y`]
  // the arguments of `Y` are another two functions, `a` and `b`
  const Y = par=>(par=>par(par))(b=>par(par=>b(b)(par)));
  const fn = Y(fn => n => {
    console.log(n);
    if (n > 0) {
      fn(n - 1);
    }
  });
}

しかし、その後、スペアが転がっているのをどうすればいいのかわからなくなりb、すべてを削除しようとしていて、気にしたことを忘れてしまいました。

私が知っている唯一の代替手段はチェーン...またはチートして文字列を呼び出しに変えることなので、私が望むのはpar関数時間を適用することだけです。n.parentNode.parentNode.parentNodeeval

関数型 JS に精通している人が、Y コンビネーターを使用してこのヘルパー関数を作成する方法について、ここでアイデアを得るのに役立つことを願っていますRecParentNode-ありがとう!

4

2 に答える 2