variance
変性、変位
もともとは圏論の用語らしい
ある型Tと、それの部分型Sがあり、
さらに、それらを型コンストラクタでwrapした型C<T>、C<S>がある時
TとSの部分型関係は、S <: Tだが (ref 部分型 <: 上位型)
C<T>とC<S>の部分型関係はどうなるのが型安全か?という話
Cの種類によって、C<S> <: C<T>となるべきだったり、C<T> <: C<S>となるべきだったりする
4種類ある
covariant
S <: TならばC<S> <: C<T>
contravariant
S <: TならばC<T> <: C<S>
invariant
covariantでもcontravariantでもないこと
bivariant
S <: TならばC<S> ≡ C<T>
以下のように捉えると直観に沿う
readする時は、covariantが必要
e.g. List<T>
writeする時は、contravariantが必要
e.g. 関数の引数
read/writeの両方を持ち合わせているものは、invariantである必要がある
e.g. Array<T>
参考
/mrsekut-book-4274069117/166 (第15章 部分型付け)
「変性」というまとまった章がある感じではない
15章で疎らに、共変や反変にふれる感じ
共変性と反変性 (計算機科学) - Wikipedia
#WIP
明示できる言語もある
Scala
+でcovariant
-でcontravariant
何もなしだと、invariant
code:scala
trait Function1-T, +U {
def apply(x: T): U
}
Kotlin
outでcovariant
inでcontravariant
何もなしだと、invariant
TypeSciprt
outでcovariant
inでcontravariant
in outで、invariant
#??
「共変」とか「反変」とかいう単語が何も想起しなくて分かりづらい
語源?を知りたい
ぎぃ (@guignol_ninja)
input/outputの話を図にしてるの初めて見たかも、いいですね
https://gyazo.com/1f4349965d7913a3d1faa854e04db331
出典のスライドがわからない
たぶん@pd1xxさんの発表?
#型システム