variantという単語から派生した色々な単語の整理

covariant, contravariant, nonvariant, invariant…など。
9
なぎせ ゆうき @nagise

共変 (covariant)反変 (contravariant) 非変(non-variant)という用語があるのか。これは便利だが意図が通じるかは疑問だな。

2010-11-06 16:48:26
都元ダイスケ🍅 @daisuke_m

@nagise 「なんちゃらvariantは、それぞれenumの要素となる」ようなイメージで見ると全く理解できない。ってか、最初そんな目で見てしまって理解できず、未だに混乱するw

2010-11-06 16:52:15
都元ダイスケ🍅 @daisuke_m

covariant contravariant invariant nonvariant variant型…

2010-11-06 16:52:54
なぎせ ゆうき @nagise

うーむ。うざいw @daisuke_m covariant contravariant invariant nonvariant variant型…

2010-11-06 16:55:26
都元ダイスケ🍅 @daisuke_m

@nagise variant型の反対がnonvariant型だったりすると、すごい直感的なんだけどね。covariant戻り値の反対がinvariant戻り値で、不変条件invariantの反対がcontravariantだったりなんかして。

2010-11-06 16:58:58
なぎせ ゆうき @nagise

Javaでいうとvariant型 -> Object型、covariant型 -> サブクラス、contravariant型 -> ?super Hoge、invariant型 -> 機能としてはないけど、不変型というとStringとかIntegerとか

2010-11-06 17:03:51
Suguru ARAKAWA @ashigeru

ついでに、ワイルドカードは型そのものではなくて、型の範囲を示すもの。

2010-11-06 17:05:08
都元ダイスケ🍅 @daisuke_m

@ashigeru 「型」自体がそもそも範囲を表していそうないめーじ.

2010-11-06 17:08:51
Suguru ARAKAWA @ashigeru

@daisuke_m それはサブタイピングつきのオブジェクト指向をやってるからそう思ってしまうだけ>型自体が範囲。あれは、起動元がスーパータイプに変換してからメソッドを呼び出していると考えると、型はしっかり合ってる

2010-11-06 17:10:28
なぎせ ゆうき @nagise

ほんとはジェネリクスの代入互換性の話をblogに書こうと思ってるんだけど、ややこしいから説明がまた壮大になっちゃうんだよね…

2010-11-06 17:06:28
Suguru ARAKAWA @ashigeru

@daisuke_m variantはもともとvariationの意味で変わる、という意図だから、co-, contra-は何かと一緒に変わるときにどう変わるか、という方向性ね。一応

2010-11-06 17:02:45
都元ダイスケ🍅 @daisuke_m

@ashigeru なるほど。しかし、「変わる」という非常に抽象的な動詞に対して、副詞成分(in/contra/co)が入ってくるくせに、主語と目的語がハッキリしないのでなにもイメージできんのだ…。何が何に変わるんだっ。 突然「変わるわよっ♪」と言われた時並の動揺。

2010-11-06 17:05:39
Suguru ARAKAWA @ashigeru

@daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき、戻り値もサブタイプになるべきで、それはco-*。引数はスーパータイプになるべきで逆にcontra-*。

2010-11-06 17:07:37
なぎせ ゆうき @nagise

ジェネリックなパラメタライズされたクラス、つまり型変数をとるHoge<T>のような型の代入互換性について考えるとき、OOPの単純な代入互換性とは別世界に足を踏み入れる事になるからな。しかも底なし沼のような世界なんだぜ

2010-11-06 17:09:11
都元ダイスケ🍅 @daisuke_m

@ashigeru うは、この説明がストンと落ちた。co-とcontra-は、ほとんどはメソッドの文脈でしか使わないモノ?

2010-11-06 17:10:44
なぎせ ゆうき @nagise

「メソッドをenclosingする型」のニュアンスが理解出来ない。メソッドが定義されているクラスのこと?いやそれだと意味がおかしくなるような @ashigeru @daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき

2010-11-06 17:11:28
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

期待あげ! RT @nagise: ほんとはジェネリクスの代入互換性の話をblogに書こうと思ってるんだけど、ややこしいから説明がまた壮大になっちゃうんだよね…

2010-11-06 17:12:08
なぎせ ゆうき @nagise

プログラミングやってて実動作から概念を学んでるから抽象概念の名前といまいちイメージが結びつかないんだ… orz

2010-11-06 17:13:19
Suguru ARAKAWA @ashigeru

@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
なぎせ ゆうき @nagise

ここまでくるとほとんどアカデミックな型システムの話に近いから、不勉強な自分が経験則で語るというのはオコガマシイのだけどね @kyon_mm 期待あげ!

2010-11-06 17:14:46
都元ダイスケ🍅 @daisuke_m

@nagise そのメソッドを定義しているクラス、だけではなく、そのサブクラスも含む感じでは?

2010-11-06 17:14:56
Suguru ARAKAWA @ashigeru

@nagise 厳密ではないですが、Javaだとそんな感じです>enclosingする型。実際は関数そのものの型でサブタイピングを考えるときに、共変とか反変とかつかいます @daisuke_m

2010-11-06 17:15:52
都元ダイスケ🍅 @daisuke_m

ある型Aをある型Bとして扱っても大丈夫なとき、AはBのサブタイプであると言い、A <: Bなどと表記する

2010-11-06 17:16:07
都元ダイスケ🍅 @daisuke_m

@ashigeru 「関数a->b」の -> 記号がわからん。数学記号?

2010-11-06 17:17:32