subtype / covariant / contravariant

subtypeと書いて「部分型(特種型)」と言うようです。多分、普通サブタイプで通じると思います。サブタイプというのは「ある型Aをある型Bとして扱っても大丈夫なとき、AはBのサブタイプであると言い、A <: Bなどと表記する」といった概念です。JavaC#の世界では、(あとで考えるGenericsを省けば)サブクラスの関係とほぼ一対一に対応します。(StudentがPersonのサブクラスのとき ⇒ StudentをPersonだと思っても大丈夫 ⇔ StudentはPersonのサブタイプ ⇔ Student <: Person)

さて、それでは関数のサブタイプを考えてみましょう。

X = A -> BとY = A' -> B'という型X,Yがあったとき、X <: Yとなるのは、A' <: AかつB <: B'が成り立っているときです。ここで、BとB'に関してはXとYの関係がそのまま引き継がれていますが、AとA'に関してはXとYの関係が逆転していることに注意してください。これは間違いではありません。こういう「関係が逆転するもの」をさして、Contravariant(反変)と言うようです。(ここのところ自信がありません。でも、すくなくともXとYのAとA'をさして「Contravariantになってる」とは言うと思います。)Covariant(共変)は、BとB'の関係を指して言います。*1


で、こっからGenericsの話につなげようと思ったけど、めんどくさくなって止めた。というか、(JVMとか.Netとかでvarianceがどうサポートされているのか)よくわかってないので少し調べてから。問題はSomeClass <: SomeClassとなるかだと思うのです > jijixiさん

#subtypeの方向がありえないくらいぐだぐだでした。ごめんなさい。修正しました。

*1:ちなみに、こういう風に変化しないものはInvariantです。