型について
- marblejenka
- 2050
- 0
- 0
- 0
共変 (covariant)反変 (contravariant) 非変(non-variant)という用語があるのか。これは便利だが意図が通じるかは疑問だな。
2010-11-06 16:48:26@nagise 「なんちゃらvariantは、それぞれenumの要素となる」ようなイメージで見ると全く理解できない。ってか、最初そんな目で見てしまって理解できず、未だに混乱するw
2010-11-06 16:52:15うーむ。うざいw @daisuke_m covariant contravariant invariant nonvariant variant型…
2010-11-06 16:55:26@nagise variant型の反対がnonvariant型だったりすると、すごい直感的なんだけどね。covariant戻り値の反対がinvariant戻り値で、不変条件invariantの反対がcontravariantだったりなんかして。
2010-11-06 16:58:58@daisuke_m variantはもともとvariationの意味で変わる、という意図だから、co-, contra-は何かと一緒に変わるときにどう変わるか、という方向性ね。一応
2010-11-06 17:02:45Javaでいうとvariant型 -> Object型、covariant型 -> サブクラス、contravariant型 -> ?super Hoge、invariant型 -> 機能としてはないけど、不変型というとStringとかIntegerとか
2010-11-06 17:03:51@ashigeru なるほど。しかし、「変わる」という非常に抽象的な動詞に対して、副詞成分(in/contra/co)が入ってくるくせに、主語と目的語がハッキリしないのでなにもイメージできんのだ…。何が何に変わるんだっ。 突然「変わるわよっ♪」と言われた時並の動揺。
2010-11-06 17:05:39@daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき、戻り値もサブタイプになるべきで、それはco-*。引数はスーパータイプになるべきで逆にcontra-*。
2010-11-06 17:07:37ジェネリックなパラメタライズされたクラス、つまり型変数をとるHoge<T>のような型の代入互換性について考えるとき、OOPの単純な代入互換性とは別世界に足を踏み入れる事になるからな。しかも底なし沼のような世界なんだぜ
2010-11-06 17:09:11@daisuke_m それはサブタイピングつきのオブジェクト指向をやってるからそう思ってしまうだけ>型自体が範囲。あれは、起動元がスーパータイプに変換してからメソッドを呼び出していると考えると、型はしっかり合ってる
2010-11-06 17:10:28@ashigeru うは、この説明がストンと落ちた。co-とcontra-は、ほとんどはメソッドの文脈でしか使わないモノ?
2010-11-06 17:10:44「メソッドをenclosingする型」のニュアンスが理解出来ない。メソッドが定義されているクラスのこと?いやそれだと意味がおかしくなるような @ashigeru @daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき
2010-11-06 17:11:28@daisuke_m というか、複合型と呼ぶような、複数の型からなるものについて呼ぶのが多い。関数a->bのa->bを(複合)型とすると、u:>a, v<:bとなるような u->vは、a->bのサブタイプなのよ。このときの要素型a, b, u, vの性質がco-とかcontra-
2010-11-06 17:13:47ここまでくるとほとんどアカデミックな型システムの話に近いから、不勉強な自分が経験則で語るというのはオコガマシイのだけどね @kyon_mm 期待あげ!
2010-11-06 17:14:46@nagise 厳密ではないですが、Javaだとそんな感じです>enclosingする型。実際は関数そのものの型でサブタイピングを考えるときに、共変とか反変とかつかいます @daisuke_m
2010-11-06 17:15:52