型システムはエラーを防ぐ
型システムは違法プログラムを排除します。次のPythonコードを検討してください。
a = 'foo'
b = True
c = a / b
Pythonでは、このプログラムは失敗します。例外をスローします。Java、C#、Haskellなどの言語では、これは合法的なプログラムではありません。これらのエラーは入力プログラムのセットでは不可能なため、完全に回避できます。
同様に、より良い型システムはより多くのエラーを除外します。超高度な型システムにジャンプすると、次のようなことが言えます。
Definition divide x (y : {x : integer | x /= 0}) = x / y
これで、型システムは0除算エラーがないことを保証します。
どのようなエラー
タイプシステムが防止できるエラーの簡単なリストを以下に示します。
- 範囲外エラー
- SQLインジェクション
- 一般化2、多くの安全性の問題(Perlでの汚染チェックの目的)
- 順不同エラー(initの呼び出しを忘れる)
- 値のサブセットを強制的に使用する(たとえば、0より大きい整数のみ)
邪悪な子猫 (はい、それは冗談でした)
- 精度低下エラー
- ソフトウェアトランザクショナルメモリ(STM)エラー(これには純度が必要です。これには型も必要です)
- 一般化8、副作用の制御
- データ構造に対する不変量(二分木はバランスがとれていますか?)
- 例外を忘れるか、間違った例外をスローする
そして、これもコンパイル時に行われることを忘れないでください。型エラーを単純にチェックするために、100%のコードカバレッジでテストを記述する必要はありません。コンパイラがあなたのためにそれを行います:)
ケーススタディ:型付きラムダ計算
では、すべての型システムの中で最も単純な、ラムダ計算と単純に型付けされたものを調べてみましょう。
基本的には2つのタイプがあります。
Type = Unit | Type -> Type
そして、すべての用語は変数、ラムダ、またはアプリケーションのいずれかです。これに基づいて、適切に型付けされたプログラムが終了することを証明できます。プログラムがスタックしたりループしたりする状況は決してありません。これは、実際にはそうではないため、通常のラムダ計算では証明できません。
これについて考えてみましょう。型システムを使用して、プログラムが永遠にループしないことを保証できます。
動的型への迂回
動的型システムは、静的型システムと同じ保証を提供できますが、コンパイル時ではなく実行時です。実際、ランタイムであるため、実際により多くの情報を提供できます。ただし、特に終了などの静的プロパティについては、いくつかの保証が失われます。
したがって、動的型は特定のプログラムを除外するのではなく、例外のスローなど、明確に定義されたアクションに不正な形式のプログラムをルーティングします。
TLDR
その長短は、型システムが特定のプログラムを除外することです。プログラムの多くは何らかの形で壊れているため、型システムではこれらの壊れたプログラムを回避します。