関数の型の事例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/22 07:06 UTC 版)
「共変性と反変性 (計算機科学)」の記事における「関数の型の事例」の解説
関数の型(英語版)での共変性と反変性は、そのサブタイプでのパラメータ型とリターン型の汎化特化を制約して、サブタイピングの型安全性を実現するための概念になる。 本節では幾つかの例から説明する。関数の型はパラメータ型 -> リターン型と書式される。記号<:は、派生 <: 基底を表わす。基底側の関数を派生側の関数で安全に代替できることを、関数の型の型安全性と言う。 ここで型Cat <: Animal とすると、関数Animal->Animalへの関数Animal->Catの代入は、その反対よりも安全なので、(Animal->Cat) <: (Animal->Animal)が推奨される。パラメータ型が同一ならば、リターン型のサブタイプ関係をそのまま関数の型のサブタイプ関係に反映できる。これは共変である。 パラメータ型の方は事情が異なり、関数Animal->Animalと関数Cat->Animalの、どちらを代入先の基底型にするべきかという疑問が提起されていた。ジョン・レイナルド(英語版)とルカ・カルデリ(英語版)によって、(Animal->Animal) <: (Cat->Animal)の方が型安全と結論付けられている。これは反変である。 パラメータ型とリターン型のコンビはやや複雑になる。ここでパラメータ型をCat <: Animalとし、リターン型を獣人 <: 動物とすると、その関数の型では、(Cat->獣人) <: (Animal->動物)よりも、(Animal->獣人) <: (Cat->動物)の方が、型安全という結論になっている。この辺りは代数学からの考え方になっている。 これはジェネリック関数でも用いられて、S func[-T, +S] (T x, T y) { ... } のように構文化される。-は反変記号、+は共変記号である。関数funcの各インスタンスは、型引数を反映したサブタイプ関係で結ばれる。
※この「関数の型の事例」の解説は、「共変性と反変性 (計算機科学)」の解説の一部です。
「関数の型の事例」を含む「共変性と反変性 (計算機科学)」の記事については、「共変性と反変性 (計算機科学)」の概要を参照ください。
- 関数の型の事例のページへのリンク