多くの静的に型付けされた言語には、パラメトリック多態性があります。たとえば、C#では次のように定義できます。
T Foo<T>(T x){ return x; }
通話サイトでは、次のことができます。
int y = Foo<int>(3);
これらのタイプは、次のように記述されることもあります。
Foo :: forall T. T -> T
「forallはタイプレベルでのラムダ抽象化のようなものです」と人々が言うのを聞いたことがあります。したがって、Fooは、型(たとえば、int)を取り、値(たとえば、型int-> intの関数)を生成する関数です。Foo(3)
多くの言語は型パラメーターを推測するため、の代わりに書くことができますFoo<int>(3)
。
f
タイプが。のオブジェクトがあるとしますforall T. T -> T
。このオブジェクトでできることは、最初に。Q
を記述して型を渡すことf<Q>
です。次に、タイプが。の値を取得しますQ -> Q
。ただし、特定f
のは無効です。たとえばこれf
:
f<int> = (x => x+1)
f<T> = (x => x)
したがって、「呼び出す」f<int>
とタイプが返さint -> int
れ、一般に「呼び出す」f<Q>
とタイプが返されるQ -> Q
ので、これは良いことです。ただし、これは、渡すタイプによって異なる動作をするためf
、タイプの有効なものではないと一般的に理解されています。forallの考え方は、これは明示的に許可されていないということです。また、forallがタイプレベルのラムダである場合、何が存在しますか?(すなわち、存在記号)。これらの理由から、forallとexistsは実際には「型レベルのラムダ」ではないようです。しかし、それでは彼らは何ですか?この質問はかなり曖昧だと思いますが、誰かが私のためにこれを解決できますか?forall T. T -> T
考えられる説明は次のとおりです。
ロジックを見ると、数量詞とラムダは2つの異なるものです。定量化された式の例は次のとおりです。
forall n in Integers: P(n)
したがって、forallには2つの部分があります。1つは定量化するセット(整数など)、もう1つは述語(Pなど)です。Forallは、高階関数と見なすことができます。
forall n in Integers: P(n) == forall(Integers,P)
タイプ付き:
forall :: Set<T> -> (T -> bool) -> bool
存在は同じタイプです。Forallは無限接続詞のようなもので、S[n]は集合Sのn番目の要素です。
forall(S,P) = P(S[0]) ∧ P(S[1]) ∧ P(S[2]) ...
存在は無限の論理和のようなものです。
exists(S,P) = P(S[0]) ∨ P(S[1]) ∨ P(S[2]) ...
型を類推すると、∧の型類似は交差型∩を計算し、∨の型類似は共用体型∪を計算していると言えます。次に、forallを定義し、次のように型に存在します。
forall(S,P) = P(S[0]) ∩ P(S[1]) ∩ P(S[2]) ... exists(S,P) = P(S[0]) ∪ P(S[1]) ∪ P(S[2]) ...
つまり、forallは無限の共通部分であり、存在するのは無限の和集合です。それらのタイプは次のようになります。
forall, exists :: Set<T> -> (T -> Type) -> Type
たとえば、多形恒等関数のタイプ。これ
Types
がすべての型のセットであり、->
関数の型コンストラクターであり、=>
ラムダ抽象化です。forall(Types, t => (t -> t))
現在、型のもの
forall T:Type. T -> T
は値であり、型から値への関数ではありません。これは、タイプがすべてのタイプT-> Tの共通部分である値であり、Tはすべてのタイプにまたがっています。このような値を使用する場合、タイプに適用する必要はありません。代わりに、サブタイプの判断を使用します。id :: forall T:Type. T -> T id = (x => x) id2 = id :: int -> int
id
これは、タイプがダウンキャストされますint -> int
。int -> int
無限の交差点にも表示されるため、これは有効です。これはうまくいくと思います。これは、forallとは何か、ラムダとの違いを明確に説明していますが、このモデルは、ML、F#、C#などの言語で見たものと互換性がありません
id<int>
。 intsで恒等関数を取得します。これはこのモデルでは意味がありません。idは値の関数であり、値の関数を返す型の関数ではありません。
型理論の知識を持っている人は、正確に何があり、何が存在するのかを説明できますか?そして、「すべてが型レベルでラムダである」というのはどの程度真実ですか?