id
は type の唯一の関数であり、 typea -> a
の
fst
唯一の関数です(a,b) -> a
。これらの単純なケースでは、これは非常に簡単にわかります。しかし、一般的に、これをどのように証明しますか? 同じタイプの可能な関数が複数ある場合はどうなりますか?
あるいは、関数の型が与えられた場合、その型の一意の (これが真である場合) 関数をどのように導出しますか?
編集:型に制約を追加し始めたときに何が起こるかに特に興味があります。
あなたが探している結果は、レイノルズのパラメトリック性から導き出されたものであり、ワドラーが無料の定理で最も有名に示したものです。
私が見た基本的なパラメトリック性の結果を証明する最もエレガントな方法は、「シングルトン型」の概念を使用しています。基本的に、ADT が与えられた場合
data Nat = Zero | Succ Nat
索引付けされたファミリー (GADT とも呼ばれます) が存在します。
data SNat n where
SZero :: SNat Zero
SSucc :: SNat n -> SNat (Succ n)
そして、すべての型を型付けされていない言語に「消去」し、同じものに消去することNat
により、言語にセマンティクスを与えることができます。SNat
次に、言語の入力規則によって
id (x :: SNat n) :: SNat n
SNat n
セマンティクスは消去によって与えられるため、関数は引数の型を使用できないため、id
いずれかから返される唯一の値Nat
は、与えられた数値です。この基本的な議論はパラメトリック性の結果のほとんどを証明するために拡張することができ、Karl Crary によってA Simple Proof Technique for Parametricity Resultsで使用されましたが、ここでのプレゼンテーションはStone と Harperに触発されたものです