問題タブ [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.
recursion - この length≤1 を複数回行う方法は?
The Little Schemerlength≤1
という本の166 ページを 1 日かけて読みました。次のコードがあります。
とl
は次(apples)
のeternity
とおりです。
166ページ(第4版)には、次のように記載されています。
mk-length
一度応募するともらえるlength≤1
その後
これを複数回行うことはできますか?
しかし、取得するためにこれを行う方法がわかりませんかlength≤2
?
haskell - 帰納的データ型が、型の再帰が->の前で発生する `data Bad a = C(Bad a-> a)`のような型を禁止するのはなぜですか?
帰納的データ型とパターンマッチングの状態に関するAgdaマニュアル:
正規化を確実にするために、帰納的発生は厳密に正の位置に現れる必要があります。たとえば、次のデータ型は許可されていません。
コンストラクターへの引数にBadの負のオカレンスがあるためです。
誘導データ型にこの要件が必要なのはなぜですか?
lisp - Lispの固定小数点コンビネータ
この構造を理解したい。誰かがこのコードについて明確で簡単な説明をすることができますか?
たとえば、Y の式を忘れたとします。どうすればそれを覚えて、作業を行った後でも再現できるでしょうか?
javascript - 私は Y-Combinator を理解できなかったので、それを実装しようとしたところ、より短いものになり、うまくいきました。そんなことがあるものか?
Yコンビネータが理解できなかったので、ネイティブ実装なしで再帰を可能にする関数を実装してみました。いろいろ考えた結果、以下のようになりました。
これは実際のものよりも短いです:
そして、驚いたことに、うまくいきました。いくつかの例:
両方のスニペットは、期待どおり 10 (0 から 4 までの合計) を出力します。
これは何ですか、なぜ短いのか、なぜ長いバージョンが好まれるのでしょうか?
clojure - チャーチ数の階乗関数
ラムダ計算、コンビネータ論理、関数型プログラミングの本で説明されているように、階乗ラムダ式を実装しようとしています。
そこに記述されている方法は次のとおりです。
どこ
およびis-zero
、、、およびはone
、標準のチャーチ数に対して定義されています。ここでの実際の定義。multiply
predecessor
私はそれを次のように翻訳しました
と
コメントアウトされたバージョンは、Rosettaコードの同等のfac関数とY関数です。
質問1:
他の場所を読んで、Y-rosetta
β-がに還元されることを理解していY-mine
ます。その場合、なぜそれを他のものよりも使用することが好ましいのですか?
質問2:
使ってもY-rosetta
。試してみるとStackOverflowErrorが発生します
その間
正常に動作します。
無防備な再帰はどこで起こっていますか?
if
フォームがclojureでどのように機能するかと関係があるのではないかと思いますが、これは私のis-zero
実装と完全には同等ではありません。しかし、私は自分でエラーを見つけることができませんでした。
ありがとう。
アップデート:
@amalloyの答えを考慮して、私はfac-mine
怠惰な議論をするように少し変更しました。私はclojureにあまり詳しくないので、これはおそらく正しい方法ではありません。しかし、基本的に、私はis-zero
匿名のゼロ引数関数を取り、それが返すものは何でも評価するようにしました。
次のようなエラーが発生します。
lazy-next-term
それが常にとと呼ばれてn
いることを考えると、これは本当に奇妙に思えますf
lambda - ラムダ計算でのスタックデータ構造とその主な操作の定義
stack
固定小数点コンビネータを使用して、ラムダ計算でデータ構造を定義しようとしています。2つの操作、insertion
およびremoval
要素のso、push
およびを定義しようとしてpop
いますが、定義できた唯一の操作である挿入が正しく機能していません。削除の定義方法がわかりませんでした。
これが私の操作に対するアプローチであり、 :push
の定義です。stack
私のスタックは、一番下を示す要素で初期化されています。私は0
ここを使用しています:
しかし、今、別の要素を挿入しようとすると、初期構造が分解されているため、機能しません。
STACK
定義または定義を修正するにはどうすればよいですか?また、操作PUSH
を定義するにはどうすればよいですか?POP
再帰を許可するには、コンビネータを適用する必要があると思いますが、その方法がわかりませんでした。
参照: http: //en.wikipedia.org/wiki/Combinatory_logic
ラムダ計算でのデータ構造の定義に関する詳細な説明や例をいただければ幸いです。
functional-programming - スキーム-ネストされたラムダを持つフィボナッチ数列
この投稿に影響を与えました。
ネストされたラムダでフィボナッチ数列を実装しようとしています-
プロンプトですr5rs:body: no expression in body in: (r5rs:body)
私の調査によると、各関数にはここに「本体」があるので、私が間違ったことは何ですか?
ここで実行しようとしている実装は、前のシリーズの再計算を回避する反復モードであることに注意してください。
編集 :
同様に機能する別のモード-
functional-programming - 固定小数点コンビネータ
私は固定小数点コンビネータの世界に不慣れで、無名ラムダの再帰に使用されていると思いますが、実際にそれらを使用する必要はなく、頭を完全に包むことさえできませんでした。
Y コンビネータの Javascript の例を見たことがありますが、うまく実行できませんでした。
ここでの質問は、直感的な答えを誰かが与えることができるかということです:
- 固定小数点コンビネータとは何ですか (理論的にだけでなく、いくつかの例のコンテキストで、そのコンテキストで固定小数点が正確に何であるかを明らかにします)?
- Y-コンビネータ以外の固定小数点コンビネータにはどのようなものがありますか?
ボーナス ポイント:例が 1 つの言語だけでなく、できればClojureでもある場合。
アップデート:
Clojureで簡単な例を見つけることができましたが、それでも Y-Combinator 自体を理解するのは難しいと感じています。
例は簡潔ですが、関数内で何が起こっているのかを理解するのは難しいと思います。提供されるヘルプは役に立ちます。
lambda - Lispコードとして書かれたラムダ微積分無限の騎士団
Knights of the Lambda Calculus のロゴには、次のように書かれた無限があります。(Y F) = (F (Y F))
この Lisp コードは同じで、無限も表しているのですか?
(Y (λ (F) (YF)))