型推論
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/05 19:25 UTC 版)
「Rust (プログラミング言語)」の記事における「型推論」の解説
Rustコンパイラは変数への代入時(variable = value)、変数の型を値の型に基づき型推論する。変数の宣言には必ずしも型を決定するための初期値を必要としない。変数の宣言時に初期値が与えられた場合は「変数の型」は「初期値の型」であると型推論がなされるが、初期値が与えられなかった場合は以降のブロックコード中のその変数へ値が初めて代入された時に「左辺の変数の型」は「右辺の代入する値の型」であると型推論がなされる。変数への代入が型不一致により失敗した場合にはコンパイル時にエラーを検出する。
※この「型推論」の解説は、「Rust (プログラミング言語)」の解説の一部です。
「型推論」を含む「Rust (プログラミング言語)」の記事については、「Rust (プログラミング言語)」の概要を参照ください。
型推論
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/17 21:54 UTC 版)
「C SharpとJavaの比較」の記事における「型推論」の解説
C# 3.0でコンテキストキーワードvarによる限定された型推論が導入された。ローカル変数の宣言時に、型を右辺から推論できる。メソッド引数やフィールドには使えない。また、ラムダ式の戻り値および仮引数は型推論により決定される。ラムダ式の仮引数は型を省略することで型推論されるが、型推論が困難な場合には明示的に型を指定する。 Java 7で導入されたダイヤモンド演算子<>は宣言文の右辺ジェネリクスの型を省略できる程度のものでしかなかったが、Java 10ではC#同様に予約型名varによるローカル変数の型推論が導入された。Java 8で導入されたラムダ式では、仮引数の型を省略することで型推論されるが、さらにJava 11ではラムダ式の仮引数の型にvarを使用して型推論できるようになった。
※この「型推論」の解説は、「C SharpとJavaの比較」の解説の一部です。
「型推論」を含む「C SharpとJavaの比較」の記事については、「C SharpとJavaの比較」の概要を参照ください。
型推論
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/20 02:06 UTC 版)
Haskell では関数のデータ型を明示しなくても処理系が自動的に型を推論する。以下は型の宣言を省略し、本体のみを宣言した引数の平方を返す関数 square である。 square x = x * x この場合 square の型は型推論され、次のように明示的に型を宣言したのと同じになる。 square :: (Num a) => a -> asquare x = x * x この宣言は、「Numのインスタンスである a の型の値を引数にとり、a の型の値を返す」と読める。ここでは「*」演算子が適用可能な最も広い型である Num a が選択されており、整数や浮動小数点数、有理数のような Num のインスタンスであるあらゆる型の値を渡すことができる。外部に公開するような関数を定義するときは、型推論によって自動的に選択される最も広い型では適用可能な範囲が広すぎる場合もある。Integer のみを渡せるように制限する場合は、次のように明示的に型を宣言すればよい。 square :: Integer -> Integersquare x = x * x 型推論のため、Haskell は型安全でありながらほとんどの部分で型宣言を省略できる。なお、次のコードは型宣言が必要な例である。read は文字列をその文字列があらわすデータ型に変換する抽象化された関数である。 main = print (read "42") -- コンパイルエラー! このコードはコンパイルエラーになる。read は複数のインスタンスで実装されており、数値なら数値型に変換する read、リストならリストに変換する read というように型ごとに実装が存在する。Haskell の型は総て静的に決定されなければならない。このコード場合、プログラマは read :: String -> Int という型をもつ実装の read が選択されると期待しているであろうが、これはコンパイラによる静的な型検査では決定できない。つまり、Haskell コンパイラは read の返り値を受け取っている関数 print の型を検査し多数の実装の中から適切な read を選択しようとするが、print は Show のインスタンスが存在するあらゆる型を引数にとるため、型推論によっても read の型を一意に決定できない。これを解消するひとつの方法は、:: によって型を明示することである。 main = print ((read "42") :: Int) -- コンパイル成功!read の返り値を Int と明示している また、そもそも read の返り値を整数型しか取らない関数に与えていればあいまいさは生じず、型推論は成功する。 printIntOnly :: Int -> IO ()printIntOnly x = print xmain = printIntOnly (read "42") -- コンパイル成功! 他の言語、たとえば Java でこのような抽象的な関数を書こうとしても、Java では返り値の値の型によって関数を選択するようなことはできない(引数の型によって選択するメソッドのオーバーロードは存在する)。そのため、関数の実装ごとに別の名前をつけてプログラマに明示的に選択させて解決させることになる。この方法は簡潔でわかりやすいが、抽象性の高さに基づく再利用性という点では Haskell のような多相には劣ってしまう。
※この「型推論」の解説は、「Haskell」の解説の一部です。
「型推論」を含む「Haskell」の記事については、「Haskell」の概要を参照ください。
型推論
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/08/09 03:08 UTC 版)
ユニフィケーションは型推論でも使われており、例えば関数型言語 Haskell で使われている。型推論を行う言語では型に関する情報をいちいち記述する必要がなく、ユニフィケーションはデータ型の誤り検出に使われる。Haskellの式 1:['a','b','c'] は型付けが正しくない。なぜならリスト構築関数 : の型は a->[a]->[a] だが、第一引数 1 からポリモルフィックな型変数 a はInt型となるのに対して、['a','b','c'] の型は[Char]であり、a は同時に Char と Int になることはできないからである。 型推論のアルゴリズムは次のようになる: 任意の型変数は任意の型表現と単一化し、その表現をインスタンス化する。理論によっては出現検査でこの規則に制約を課すこともある。 2つの型定数は両者が同じ型のときのみ単一化される。 2つの型構築は、両者が使用する型構築子が同じで、それらのコンポーネント型が再帰的に単一化されるときのみ単一化される。 宣言的特徴から、ユニフィケーションが行われる順序は通常重要ではない。
※この「型推論」の解説は、「ユニフィケーション」の解説の一部です。
「型推論」を含む「ユニフィケーション」の記事については、「ユニフィケーション」の概要を参照ください。
型推論
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/08/06 04:25 UTC 版)
詳細は「型推論」を参照 静的な型システムの言語では型宣言を必要とし、基本的にプログラマはすべての変数に特定の型を明示的に関連付けなければならない。しかし、変数の初期化時の右辺値や変数の使われ方など、プログラマが型を明示せずともコードの文脈から型を自動的に決定する型推論(type inference)の機能を持つ言語もある。例として、Haskellにおいて変数 x と y を加算する関数 f を定義してみる。 f x y = x + y ここで、x と y の型を特に明示していないが、+による加算は数値のみに定義されているので、コンパイラは x と y は共に数値型であると推論できる。ゆえにプログラム中で f の引数として数値でない型(文字列やリストなど)の値を渡して呼び出すとエラーを報告する。 main = do print (f 1 2) -- 3 print (f 1.0 2.0) -- 3.0 --print (f "hoge" "fuga") -- コンパイルエラー。 型推論の目的は、単にコードの記述効率を向上したり、型のミスマッチに起因するエラーを軽減したりすることだけではない。ラムダ式や匿名型など、コンパイラが内部で型を自動生成し、プログラマが具体的な型の名前をコード上で書き下すことができない場合もあり、そういった機能に対応しなければならないという目的もあって型推論を導入した言語もある(C++やC#など)。
※この「型推論」の解説は、「型システム」の解説の一部です。
「型推論」を含む「型システム」の記事については、「型システム」の概要を参照ください。
型推論と同じ種類の言葉
Weblioに収録されているすべての辞書から型推論を検索する場合は、下記のリンクをクリックしてください。
全ての辞書から型推論を検索
- 型推論のページへのリンク