さて、一つずつ行きましょう。
値
値は、プログラムが評価して調整する具体的なデータです。派手なものは何もありません、いくつかの例は
1
true
"fizz buzz foo bar"
タイプ
型のわかりやすい説明は、「値の分類子」です。型は、実行時にその値がどうなるかについての少しの情報ですが、コンパイル時に示されます。
たとえばe : bool
、コンパイル時に、それe
が実行時true
またはfalse
実行中であることを知っている場合、他に何もありません!型は値をこのようにうまく分類するため、この情報を使用してプログラムのいくつかの基本的なプロパティを決定できます。
たとえば、あなたがいつ、そしてを追加するのe
を見たなら、何かが少しずれていることがわかります!実際、これにフラグを立てて、コンパイル時にエラーを投げることができます。「ねえ、それはまったく意味がありません!」e'
e : int
e' : String
より強力な型システムにより、より興味深い値を分類する、より興味深い型が可能になります。たとえば、いくつかの機能を考えてみましょう
f = fun x -> x
それはかなり明確ですがf : Something -> Something
、それは何Something
でしょうか?退屈な型システムでは、のような任意のものを指定する必要がありますSomething = int
。より柔軟な型システムでは、次のように言えます
f : forall a. a -> a
つまりa
、「いずれの場合も、にf
マッピングa
するa
」ということです。これにより、f
より一般的に使用して、より興味深いプログラムを作成できます。
さらに、コンパイラは、指定した分類子を実際に満たすかどうかをチェックしf = fun x -> true
ます。バグがある場合、コンパイラはそう言います!
tldrとして; 型は、実行時に式が持つことができる値に対するコンパイル時の制約です。
型コンストラクタ
いくつかのタイプは関連しています。たとえば、整数のリストは文字列のリストに非常に似ています。これはsort
、整数の場合がsort
文字列の場合とほとんど同じです。それらの違いを一般化し、要求に応じて構築することにより、これらのほぼ同じタイプを構築する一種の工場を想像できます。それが型コンストラクターです。型から型への関数のようなものですが、もう少し制限があります。
古典的な例は一般的なリストです。の型コンストラクタは単なる一般的な定義です
data List a = Cons a (List a) | Nil
これList
は、型a
をその型の値のリストにマップする関数です!Javaランドでは、これらはおそらく「ジェネリッククラス」と呼ばれていると思います
型パラメーター
型パラメーターは、型コンストラクター(または関数)に渡される型です。値レベルと同じように、型パラメーターを持つ方法と同じようにfoo(a)
パラメーターがあると言います。a
List a
a
種類
種類は少し難しいです。基本的な考え方は、特定のタイプが似ているということです。たとえば、java 、... にはすべてのプリミティブ型がint
ありchar
、float
これらはすべて同じ「型」を持つように動作します。例外として、型自体の分類子については、分類子を種類と呼びます。ですからint : Prim
、String : Box
、List : Boxed -> Boxed
。
このシステムは、型が値を管理する方法と同様に、どのような種類の型をどこで使用できるかについて、すばらしい具体的なルールを提供します。言うのは明らかにナンセンスだ
List<List>
または
List<int>
Javaでは、List
そのように使用される具体的な型に適用する必要があるためです!それらの種類List : Boxed -> Boxed
とを見てみるとBoxed -> Boxed /= Boxed
、上記は種類エラーです!
ほとんどの場合、種類についてはあまり考えず、単にそれらを「常識」として扱いますが、より洗練された型システムでは、考えることが重要です。
これまで私が言ってきたことの小さなイラスト
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
ウィキペディアよりも良い読書
この種のことに興味があるなら、良い教科書に投資することを強くお勧めします。一般に、型理論とPLTは非常に広大であり、一貫した知識ベースがなければ、あなた(または少なくとも私)は何ヶ月も何処にも行かずに歩き回ることができます。
私の好きな本の2つは
- 型とプログラミング言語-Ben Pierce
- プログラミング言語の実用的な基礎-ボブ・ハーパー
どちらも私が今話したことを紹介する優れた本であり、さらに美しく、詳細に説明された詳細です。