システムF(および他の純粋な型システム)での再帰型エンコーディング


8

私は純粋な型システム、特に構造の計算を研究しており、フィリップワドラーによれば、再帰型のエンコーディングを使用してそれを可能にしようとしています。例として、私はMorte Haskellライブラリを使用して、Cardelliによって指定されたスコット数値をエンコードしています。

エンコーディングの概要は次のとおりです:(正の)再帰型が与えられた場合...

μバツF バツ

...システムFのタイプとしてエンコードする場合があります...

Lfバツ バツF バツ = ΛバツF バツバツバツ

...または、純粋な型システムの表記法(明示的な)...F

Lfバツ = ΠFΠバツF バツバツバツ

... Fは型コンストラクターであるため(は型の型)。

これをエンコードするには、Wadlerによると、foldoutの 3つの関数を宣言する必要がありout、スコット数値のエンコードでCardelliによって使用されます。

fold:すべてX(FX-> X)-> T-> X

fold = \ X。\ k:FX->X。\ t:T。t X k

in:FT-> T

in = \ s:F T. \ X。\ k:FX-> X. k(F(fold X k)s)。

TLfiバツ XF バツです。)

与えられたように関数を書くのは簡単です。しかし、関数を書き込もうとすると、型チェックされないようです。式型はであり、の型はでなければなりません。次に、は(aのように見えるの型であると推測します。型コンストラクタ()であるため、型チェックは行われません。fold(fold X k)TバツF fold バツ k sF バツFTバツF TF バツfmapF

これはタイプミスのようではありません ...何か不足していますか?

回答:


7

カテゴリ理論では、型コンストラクタとその型コンストラクタに対するマップ関数に同じ記号が使用されるという慣例があります。したがって、f:X-> Yの場合、F f:FX-> F Yとなります。


それで、それは確かにfmapです!カテゴリ理論についてはまったく経験がありませんでしたが、実際には約10分前に「カテゴリデータタイプに関するメモ」(GC Wralth)でそれを見つけました。私は今、正しい関数を書くことができ、魅力のように働きました。どうもありがとう、博士。ワドラー!:D
paulotorrens 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.