型推論
型推論(かたすいろん)とはプログラミング言語の機能の1つで、静的な型付けを持つ言語において、変数や関数の型を宣言しなくてもそれを導くのに使われた関数の型シグネチャなどから自動的に型を決定する機構のこと。主に関数型言語で用いられる。
推論に失敗するとその時点でエラーを報告できるため、少なくとも誤った型を用いる事によるバグは回避できる。また、記述をアルゴリズムに集中できるのでプログラムの抽象度が上がるというメリットもある。
代表的な型推論アルゴリズムとして、Hindley/Milner 型推論アルゴリズムがある。各々著名なコンピュータ科学者の名前からつけられた名前であるが、Hidley は論理学者として型推論システムを先に開発した。
型推論を持つ言語としてはHaskell、ML、Vala、C#、Scala、OCaml、D言語、Concurrent Clean、C++11、Swiftなどがある。Javaでも導入が検討されている。静的型付け関数型言語のほとんどが型推論の機能を持っている。
非技術的な説明
ほとんどの言語においては、関数の仮引数および戻り値やローカル変数等は、それらがもつデータの種類を表す型をもつ。実行時にならないと型がわからない言語を動的型付けの言語という。一方、コンパイル時に型がわかる言語を静的型付けの言語という。静的型付けの言語において、関数の仮引数および戻り値の型やローカル変数の型は、通常は明示的に表記する必要がある。例えば、次はC言語の例である。
int addone(int x) { int result; result = x+1; return result; }
関数定義の最初の行int addone(int x)
では、addone
は整数一つを入力としてとり、整数を結果として出力する、と宣言している。int result;
の行では、ローカル変数result
が整数型であることを宣言している。
型推論の機能がある言語では、例えば次のように書くことができるだろう。
addone(x) { var result; result = x+1; return result; }
この書き方は動的型付けの言語に非常によく似ているが、しかしながらすべての型はコンパイル時に定められる。この仮想的な例では、+
演算子は常に二つの整数を一つの整数に変換する。これから、x+1
の値が整数であることが型推論によって推論される。故にresult
の型は整数であり、addone
の返り値が整数であることがわかる。同様に+
演算子が入力として整数をとることからx
が整数であることがわかり、addone
の引数の型が整数であることがわかる。
動的型言語における型推論
動的に型付けを行う言語の場合、文法的には型付けが行われず、あらゆる型の可能性を考慮して処理を進める必要があるため、処理が遅くなる原因となる[1]。JITコンパイラによって高速化を図る場合、型推論によりあるデータを「特定の型」として扱うことが可能であれば、その型に合わせた処理だけをすることで高速化が行える[1]。
JavaScript では、Webブラウザの分野では高速化が特に求められている[2]が、2011年12月20日にリリースされたFirefox 9から高速化のため型推論技術を採用している[3]。
Groovy 2.0 ではコンパイル時型検査 @TypeChecked
の機能をつけたが、型を指定していない変数に対しても、型推論を利用して変数に型を割り振り、型検査を行っている。同様に Groovy に対応した IntelliJ IDEA などの統合開発環境も型推論を利用してアシストを行っている。
脚注
テンプレート:Reflistテンプレート:Asbox- ↑ 1.0 1.1 Type Inference brings JS improvements to Firefox Beta Brian Hackett, 2011年11月10日(2011年12月24日閲覧)。
型推論により Firefox Beta の JavaScript が高速化しました(上の記事の和訳)、2011年12月24日閲覧。 - ↑ テンプレート:Cite web
- ↑ テンプレート:Cite web