問題タブ [church-encoding]
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.
haskell - 教会のエンコーディング (条件)
ラムダ計算を書き出そうとしていますが、教会の条件を機能させることができません。私はおそらく Haskell 初心者だと言うべきでしょう。
私はオンラインと SO で解決策を見てきましたが、それらはすべて新しい型やその他のトリックの導入を伴いますが、できるだけ元の構文に近づけたいと考えています。例えば:
教会のブール値の正確な構文に一致します。
教会のif/elseの正確な構文を一致させる方法はありますか? を複製しようとして\p.\a.\b.p a b
いますが、何が間違っているのかわかりません:
scheme - スキームで教会のエンコーディングを理解しようとしています
私は、Scheme を通じて教会のエンコーディングの原理全体を理解しようとしています。などの基本は理解できたと思います。
0 の教会数字
(定義 c-0 (ラムダ (f) (ラムダ (x) x)))
1の教会数字
(定義 c-1 (ラムダ (f) (ラムダ (x) (fx))))
...そして、関数を x N 回適用し続けます。
今私の問題は、これが何を意味するのかということです。たとえば、church-3 を例にとると、次のようになります。
これは実際に何をしているのですか?私も基本的なスキームの知識しか持っていませんが、関数の使用方法さえ理解していませんか? c-3 関数を使用した入力例は何ですか? ループのように3回適用するだけですか?
recursion - Sml Church 数字型推論
SML にこの式があり、最も一般的なタイプを見つける必要があります。コンパイラを実行すると、以下に示すものが表示されます。この関数だけでなく、教会の数字関数「2」などの他の関数の最も一般的なタイプを見つけるにはどうすればよいでしょうか。
これのタイプはなぜですか:
haskell - スコットでエンコードされたリストを折りたたむ非再帰的な用語はありますか?
次のようなスコットでエンコードされたリストがあるとします。
この種のリストを受け取り、それを実際のリスト ( [1,2,3]
) に変換する関数が必要ですが、そのような関数は再帰できません。つまり、これは eta-beta 正規形でなければなりません。その機能はありますか?
haskell - Free モナドに Church エンコーディングを使用するにはどうすればよいですか?
パッケージのFree
データ型を使用してControl.Monad.Free
います。free
今、私はそれを変換して使用しようとしてF
いControl.Monad.Free.Church
ますが、関数をマップする方法がわかりません。
たとえば、 を使用した単純なパターン マッチング関数Free
は次のようになります。
-とのF
間で変換して使用する関数に簡単に変換できます。Free
toF
ただし、使用せずにそれを実行する方法がわかりませんfromF
-
私が見逃している一般的なパターンがあるに違いありません。それを理解するのを手伝ってもらえますか?
haskell - 教会でエンコードされたリストのカタモルフィズム
Churchエンコーディングのリストにパッケージcata
から使えるようにしたいです。recursion-schemes
便宜上二等式を使いましたが、気にしません。newtype
必要に応じてを追加したり、GADT を使用したりしてください。
Church エンコーディングの考え方は広く知られており、単純です。
基本的に「未指定の抽象」cons
でありnil
、「通常の」コンストラクターの代わりに使用されます。私はすべてがこの方法でエンコードできると信じています(Maybe
、ツリーなど)。
List1
が実際に通常のリストと同型であることを示すのは簡単です:
したがって、その基本ファンクターはリストのファンクターと同じであり、それを実装project
してからの機構を使用できるはずrecursion-schemes
です。
でもできなかったので、「どうしたらいいの?」というのが私の質問です。通常のリストの場合は、パターン マッチのみを実行できます。
関数のパターン マッチができないため、フォールドを使用してリストを分解する必要があります。project
通常のリストの折り畳みベースを書くことができます:
ただし、教会でエンコードされたリストには適用できませんでした。
cata
次の署名があります。
リストで使用するには、次のものが必要です。
- を使用してリストの基本ファンクタ型を宣言するには
type family instance Base (ListC a) = ListF a
- 実装する
instance Recursive (List a) where project = ...
私は両方のステップで失敗します。
list - 等式の推論を破ることなく教会のエンコーディングを使用することは可能ですか?
このプログラムに注意してください:
合計の両方の定義は、等式の推論までは同じです。それでも、2 番目の定義のコンパイルは機能しますが、最初の定義はコンパイルされず、次のエラーが発生します。
RankNTypes
等式の推論を破るようです。それを壊すことなく、Haskellで教会でエンコードされたリストを持つ方法はありますか??