限定公開でまとめを作れば、相互フォローやフォロワー限定でまとめを共有できます!

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

covariant, contravariant, nonvariant, invariant…など。
用語
2672view 1コメント
9
なぎせ ゆうき @nagise
共変 (covariant)反変 (contravariant) 非変(non-variant)という用語があるのか。これは便利だが意図が通じるかは疑問だな。
都元ダイスケ🍅 @daisuke_m
@nagise 「なんちゃらvariantは、それぞれenumの要素となる」ようなイメージで見ると全く理解できない。ってか、最初そんな目で見てしまって理解できず、未だに混乱するw
都元ダイスケ🍅 @daisuke_m
covariant contravariant invariant nonvariant variant型…
なぎせ ゆうき @nagise
うーむ。うざいw @daisuke_m covariant contravariant invariant nonvariant variant型…
都元ダイスケ🍅 @daisuke_m
@nagise variant型の反対がnonvariant型だったりすると、すごい直感的なんだけどね。covariant戻り値の反対がinvariant戻り値で、不変条件invariantの反対がcontravariantだったりなんかして。
なぎせ ゆうき @nagise
Javaでいうとvariant型 -> Object型、covariant型 -> サブクラス、contravariant型 -> ?super Hoge、invariant型 -> 機能としてはないけど、不変型というとStringとかIntegerとか
Suguru ARAKAWA @ashigeru
ついでに、ワイルドカードは型そのものではなくて、型の範囲を示すもの。
都元ダイスケ🍅 @daisuke_m
@ashigeru 「型」自体がそもそも範囲を表していそうないめーじ.
Suguru ARAKAWA @ashigeru
@daisuke_m それはサブタイピングつきのオブジェクト指向をやってるからそう思ってしまうだけ>型自体が範囲。あれは、起動元がスーパータイプに変換してからメソッドを呼び出していると考えると、型はしっかり合ってる
なぎせ ゆうき @nagise
ほんとはジェネリクスの代入互換性の話をblogに書こうと思ってるんだけど、ややこしいから説明がまた壮大になっちゃうんだよね…
Suguru ARAKAWA @ashigeru
@daisuke_m variantはもともとvariationの意味で変わる、という意図だから、co-, contra-は何かと一緒に変わるときにどう変わるか、という方向性ね。一応
都元ダイスケ🍅 @daisuke_m
@ashigeru なるほど。しかし、「変わる」という非常に抽象的な動詞に対して、副詞成分(in/contra/co)が入ってくるくせに、主語と目的語がハッキリしないのでなにもイメージできんのだ…。何が何に変わるんだっ。 突然「変わるわよっ♪」と言われた時並の動揺。
Suguru ARAKAWA @ashigeru
@daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき、戻り値もサブタイプになるべきで、それはco-*。引数はスーパータイプになるべきで逆にcontra-*。
なぎせ ゆうき @nagise
ジェネリックなパラメタライズされたクラス、つまり型変数をとるHoge<T>のような型の代入互換性について考えるとき、OOPの単純な代入互換性とは別世界に足を踏み入れる事になるからな。しかも底なし沼のような世界なんだぜ
都元ダイスケ🍅 @daisuke_m
@ashigeru うは、この説明がストンと落ちた。co-とcontra-は、ほとんどはメソッドの文脈でしか使わないモノ?
なぎせ ゆうき @nagise
「メソッドをenclosingする型」のニュアンスが理解出来ない。メソッドが定義されているクラスのこと?いやそれだと意味がおかしくなるような @ashigeru @daisuke_m だから、メソッドの文脈でいえば、そのメソッドをenclosingする型がサブタイプになるとき
きょん@うさみみモード @kyon_mm
期待あげ! RT @nagise: ほんとはジェネリクスの代入互換性の話をblogに書こうと思ってるんだけど、ややこしいから説明がまた壮大になっちゃうんだよね…
なぎせ ゆうき @nagise
プログラミングやってて実動作から概念を学んでるから抽象概念の名前といまいちイメージが結びつかないんだ… orz
Suguru ARAKAWA @ashigeru
@daisuke_m というか、複合型と呼ぶような、複数の型からなるものについて呼ぶのが多い。関数a->bのa->bを(複合)型とすると、u:>a, v<:bとなるような u->vは、a->bのサブタイプなのよ。このときの要素型a, b, u, vの性質がco-とかcontra-
なぎせ ゆうき @nagise
ここまでくるとほとんどアカデミックな型システムの話に近いから、不勉強な自分が経験則で語るというのはオコガマシイのだけどね @kyon_mm 期待あげ!
都元ダイスケ🍅 @daisuke_m
@nagise そのメソッドを定義しているクラス、だけではなく、そのサブクラスも含む感じでは?
Suguru ARAKAWA @ashigeru
@nagise 厳密ではないですが、Javaだとそんな感じです>enclosingする型。実際は関数そのものの型でサブタイピングを考えるときに、共変とか反変とかつかいます @daisuke_m
都元ダイスケ🍅 @daisuke_m
ある型Aをある型Bとして扱っても大丈夫なとき、AはBのサブタイプであると言い、A <: Bなどと表記する
都元ダイスケ🍅 @daisuke_m
@ashigeru 「関数a->b」の -> 記号がわからん。数学記号?
残りを読む(30)

コメント

Terry (とのっちょ)@NZ @tonoccho 2010-11-06 18:37:53
variantもvary+antではなかろうか。antは~するもの、という接尾辞だっけ。 coは一緒に、とか、共有して contraはなんちゃらに反してとかなんチャラとは反対にとか inは、意味を反対にする そんな接頭辞 そこから考えるに、covariantは何かが変わると一緒に変わる物(一方が増えると一緒に増えるとか)、contravariantは、何かが変わらないと変わっちゃうもの(一方が増えないと増えていくとか)、か、何かが変わるとそれとは反対の方向に変わる物(何かが増えると減っていくとか)。
ログインして広告を非表示にする
ログインして広告を非表示にする