問題タブ [y-combinator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - JavaScript と elixir での Y コンビネータの実装
私は Y Combinator を研究しており、それがどのように機能するかを紙の上で理解していますが、プログラミング言語でどのように実装できるかはまだわかりません。
Y コンビネータの導出は次のようになります。
彼はどのように拡張できY(F)
ますλ x.(Y(F))(x)
か?そして、彼はどのように U Combinator を使用できるのでしょうか?
Javascript と Elixir での実装は次のとおりです。
これが式: の場合Y = \f.(\x.f(x x))(\x.f(x x))
、ラムダ式の f, x と上記の実装の f, x, y の関係は何ですか? x は同じ x のように見え、f は同じ f のように見えます。それでは何y
ですか?具体的には、ラムダx x
が使用する関数にラップされるのと同等なのはなぜy
ですか?
y
関数への引数のようなものです! ?
scheme - なぜSchemeはYコンビネータの実装でapplyを必要としますが、Racketはそうしませんか?
Racket の Y コンビネータは次のとおりです。
私の質問は、Scheme がapply
関数を必要とするのに、Racket が必要としないのはなぜですか?
clojure - y-combinator がチューリング等価性を提供するのはなぜですか?
この答えは言う
以下は、ラムダ計算における基本的な y コンビネータです。
Y f = (\x -> f (x x)) (\x -> f (x x))
つまり、Clojure では次のようなものです。
y-Combinator の別の式を次に示します (引数のステップ 2)。
チューリング完全言語をエンコードしました (y-Combinator を使用したため) (引数のステップ 3)
私の質問は、y-combinator がチューリング等価性を提供するのはなぜですか? それは議論の単なる仮定だったようです。
lambda-calculus - ブロック内の外部変数と Y コンビネータにアクセスする
皆さんが元気であることを願っています。Harbor で固定小数点Y コンビネータを実装していますが、問題が発生しています。Y コンビネータは、ラムダ計算によって次のように定義できます。
Y = (λh.λF.F(λ x.((h(h))(F))(x))) (λh.λF.F(λ x.((h(h))(F))(x)))
パフォーマンスの質問で、Y-combinator を使用してメモ化を適用しようとしています。私の現在の実装は次のとおりです。
基本的に、ブロック内でステートメントを使用することはできませんが、式を使用することはでき、問題なく動作します。私は無限再帰と、0から無限までの制限を回避しています。
ここまでは問題なくコンパイルできますが、外側のブロックの変数にアクセスしようとすると、Harbor に顔を蹴られてしまいます。
Y コンビネーターの実装をテストするために、フィボナッチ数列の単純な実装を適用しようとしましたが、パラメーターを受け取るG
ブロックを返し、パラメーターを受け取るブロックを暗黙的に返すと、使用できなくなりN
、G
コンパイラーは「外側のコードブロック変数に到達できません。」
これにより、ブロックをカリー化することもできます。私の質問は、ハーバーでブロック内の外部変数にアクセスするにはどうすればよいですか?
recursion - Little Schemer: 長さ ≤ 2 のリストのみをサポートする write 関数
本The little schemerでは、長さが1以下のリストのみをサポートするこの関数を見つけました。
段階的に学習し、 2以下の長さのリストのみをサポートする同様の関数を作成したいと考えています。
次のようなコードを提供して、この質問に答えないでください。
この関数は任意の長さをサポートするためです。
そして、私はすでに次のような関数を書く方法を知っています:
私の目標を達成するために。しかし、このコードは最初のスニペットから一歩離れています。
たぶん、私は変更すべきではありません: