プログラミング基礎概念

型推論 かたすいろん

静的型付け動的型付けコンパイラTypeScript型システム変数
型推論について教えて

簡単に言うとこんな感じ!

「この箱には数字が入ってるな」ってコンパイラが自動で察してくれる機能だよ! プログラマーがいちいち「これは整数型です」と書かなくても、代入された値を見てコンピューターが型を推測してくれるんだ。手間が減ってコードもスッキリするってこと!


型推論とは

型推論(Type Inference)とは、プログラミング言語のコンパイラや処理系が、プログラマーが明示的に型を書かなくても、文脈や代入された値などから変数・式の型を自動的に推測・決定する仕組みのことです。たとえば x = 42 と書いただけで「xは整数型だ」と判断してくれます。

型推論がない言語では、変数を使うたびに int x = 42; のように「この変数は整数型です」と宣言する必要があります。一方、型推論を持つ言語では x = 42val x = 42 のように書くだけで済みます。コードが短く読みやすくなり、型の安全性(バグの早期発見)は保ちながら、記述の手間を大幅に削減できるのが最大のメリットです。

現代の主要言語であるTypeScriptKotlinSwiftRustGoHaskellなどは型推論を標準でサポートしています。特にシステム開発の現場では「型推論があるかどうか」が言語選定の重要な観点のひとつになっています。


型推論の仕組みと種類

型推論がどのように働くかを整理すると、大きく次の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の型ヒントのような補助的な機能は存在します)。

型システムの分類マップ 静的型付け言語 (コンパイル時に型チェック) 型推論なし Java(旧来) C / C++ 型推論あり ✓ Kotlin / Swift Rust / TypeScript コンパイル時に型の整合性をチェック → バグを実行前に発見できる 型推論があると宣言を省略しつつ 安全性は維持できる 動的型付け言語 (実行時に型チェック) 型宣言不要(型推論とは別) Python / JavaScript / Ruby 実行するまで型が確定しない 実行時に型エラーが発覚することも → 柔軟だが大規模開発では管理が難しい Pythonの型ヒント(mypy)は 静的解析で補助的に型チェック ※ 型推論は主に静的型付け言語の概念。動的型付けとは仕組みが異なる

関連用語

  • ./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 — リント(静的解析):コードの問題をコンパイル前に発見するツール群