Open4
型システム関連メモ
プログラミングに限定した話を、圏論のスクラップに混ぜるのも微妙な気がしたので一旦こちらへ書く。
共変、反変の話
どういう型が、ある型引数に対して反変・共変になるか:
・型引数の型が、関数の戻り値(あるいは関数でない、単純なプロパティー)として使われていれば共変となり、
・型引数の型が、関数の引数として使われていれば反変となる
この違いは、関数を使う側と関数自身、どちらが変数(引数)に代入する値を決める立場にあるか、という点にあります。関数の戻り値は、関数自身が変数に代入する値を決める一方、関数の引数は、関数を使う側が引数に代入する値を決めるからです。変数に代入する値の型は、変数の型のサブタイプでなければならないので、代入する値の型(引数として渡す型)がサブタイプとなるように定められているのです。
ジェネリックな型とその実装の関係を、利用者側の視点でイメージすると分かりやすい。
プロパティや戻り値では、定義から外れた値域を返されては困る。
だから、定義内の値になる実装であってほしい。
パラメータは、定義内の値域をサポートしてくれていなければ困る。
だから、定義内の値は全て受け入れられる実装であってほしい。
昔見た記事
別にジェネリックな型に限らない話。