型推論 かたすいろん
型推論とは
型推論(Type Inference)とは、プログラミング言語のコンパイラや処理系が、プログラマーが明示的に型を書かなくても、文脈や代入された値などから変数・式の型を自動的に推測・決定する仕組みのことです。たとえば x = 42 と書いただけで「xは整数型だ」と判断してくれます。
型推論がない言語では、変数を使うたびに int x = 42; のように「この変数は整数型です」と宣言する必要があります。一方、型推論を持つ言語では x = 42 や val x = 42 のように書くだけで済みます。コードが短く読みやすくなり、型の安全性(バグの早期発見)は保ちながら、記述の手間を大幅に削減できるのが最大のメリットです。
現代の主要言語であるTypeScript・Kotlin・Swift・Rust・Go・Haskellなどは型推論を標準でサポートしています。特にシステム開発の現場では「型推論があるかどうか」が言語選定の重要な観点のひとつになっています。
型推論の仕組みと種類
型推論がどのように働くかを整理すると、大きく次の3パターンに分けられます。
| 種類 | 説明 | 代表例 |
|---|---|---|
| ローカル型推論 | 右辺の値から変数の型を推論する最もシンプルな形 | TypeScript, Go |
| 双方向型推論 | 代入先の期待型と代入値の両方を見て推論する | Scala, Kotlin |
| グローバル型推論(Hindley-Milner) | 関数全体・プログラム全体を解析して型を決定する高度な推論 | Haskell, ML系言語 |
具体的なコード比較
型推論あり/なしを並べると違いが一目瞭然です。
【型を明示(型推論なし)】
int age = 30;
String name = "Alice";
List<String> items = new ArrayList<String>();
【型推論あり(TypeScript/Kotlin風)】
val age = 30 // → 自動でInt型
val name = "Alice" // → 自動でString型
val items = listOf() // → 自動でList<String>型
覚え方:「賢い空気読みコンパイラ」
型推論は「場の空気を読んで察する優秀な同僚」です。「42を入れたから整数型ね」「“hello”を入れたから文字列型ね」と自動で判断してくれます。あなたが毎回「これは整数です!」と宣言しなくても動いてくれる、気の利くやつです。
歴史と背景
- 1958年 — ML言語の前身となる研究が始まる。型推論の理論的基盤が萌芽
- 1969年 — ロビン・ミルナーがHindley-Milner型推論アルゴリズムを定式化(後の関数型言語の礎)
- 1973年 — ML(Meta Language)言語が開発され、型推論を実用的に実装した最初の主要言語となる
- 1990年代 — Haskellが登場し、強力な型推論と型システムを持つ純粋関数型言語として注目される
- 2000年代 — C#(2007年のC# 3.0)が
varキーワードで局所的な型推論を導入し、主流言語に普及 - 2009年 — GoogleがGo言語をリリース。
:=演算子による型推論が特徴的 - 2011年 — Kotlin(JVM向け)、Rustが登場。型推論を言語設計の中心に据える
- 2012年 — TypeScriptがリリース。JavaScriptに型推論付きの型システムを追加し、Webフロントエンド開発に型安全性をもたらす
- 現在 — TypeScript, Kotlin, Swiftなどの普及により、型推論は「モダンな言語には当然備わっているもの」として定着
静的型付け・動的型付けとの関係
型推論は「静的型付け言語と動的型付け言語のどちらにあるか」という点でよく混乱されます。整理しましょう。
| 分類 | 型チェックのタイミング | 型推論の有無 | 代表言語 |
|---|---|---|---|
| 静的型付け+型明示 | コンパイル時 | なし | Java(初期), C |
| 静的型付け+型推論 | コンパイル時 | あり | Kotlin, Swift, Rust, TypeScript |
| 動的型付け | 実行時 | (概念的には不要) | Python, JavaScript, Ruby |
型推論は主に「静的型付け言語」の機能です。動的型付け言語(PythonやJavaScript)は実行時まで型が決まらないので、型推論とは別の概念になります(ただしPythonの型ヒントのような補助的な機能は存在します)。
関連用語
- ./018-static-typing.md — 静的型付け:コンパイル時に変数の型を決定する方式
- ./019-dynamic-typing.md — 動的型付け:実行時に型が決まる方式
- ./020-type-system.md — 型システム:プログラム中の値の種類を分類・管理する仕組み全体
- ./022-compiler.md — コンパイラ:ソースコードを機械語に変換するプログラム。型推論はここで行われる
- ./023-typescript.md — TypeScript:JavaScriptに型推論付きの型システムを追加した言語
- ./024-generics.md — ジェネリクス:型をパラメータとして扱う仕組み。型推論と組み合わせて使われる
- ./025-duck-typing.md — ダックタイピング:「使える操作があればOK」という動的型付け言語の型の考え方
- ./026-lint.md — リント(静的解析):コードの問題をコンパイル前に発見するツール群