🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.misc
Article #166

Re: covariant and contravariant (Re: The lang I love.)

#166
From: MORI Koichiro
Date: Mon, 25 Nov 1996 00:00
64 lines
3208 bytes
森です。fj.lang.functional にもふってみます。

>>>>> "yoshida" == Yoshida Atsushi <yoshida@tutkie.tut.ac.jp> writes:

  yoshida> 型理論の専門家ではないので、厳密な定義は知らないのですが、
  yoshida> 覚えている範囲では以下のような意味だと思います。(専門家が
  yoshida> 厳密な定義(またはそのポインタ)を教えてくれると祈りつつ... ^^;)

型理論の専門家じゃないですが、吉田さんの定義はちょっと違うように思いま
す。

吉田さんと同様、型 S が型 T の部分型(subtype)であるとき

	S <= T

と表すことにし、型 S から型 T への関数の型を

	S -> T

と書くことにしましょう。

このとき

	T1 <= S1 かつ S2 <= T2 のとき、S1 -> S2 <= T1 -> T2

が成立すれば型システムは健全です。これを、関数の引数の型の不等号の順序
が逆転していることから contravariant rule と呼んでいます。

もしも S1 <= T1 (Eiffel はこれ)だと covariant rule ということになり、
その場合はtype safeではなくなり、吉田さんがおっしゃるように静的な型検
査が不可能になります。

しかし、contravariant rule をそのまま採用すると、以下に示すように大変
不便な仕様となります。

いま型 T のオブジェクト q と、型 S のオブジェクト p があるとしましょう。
S <= T とし、T には equal というメソッドが定義されているとします。
T.equal は T x T -> Bool です。一方、p にも同じメソッドが定義されてお
り、この型は S x S -> Bool ということになります。ここで、二つのメソッ
ド(関数)の型が S.equal <= T.equal を満たすとすると、contravariant rule
から T <= S でなくてはなりません!

これでは困るので、Eiffel などの言語では S.equal <= T.equal が成り立た
ない(実行時に型の不一致エラーが起こる可能性がある)仕様にしているわけで
す。

これが有名な covariance-contravariance controversy だと思うんですけど。


参考文献として、以下の論文をあげておきます。この論文では、covariant
rule と contravariant rule は矛盾する概念ではなく、型システムの中で統
一的に扱えるものだということを主張しています。

%A Giuseppe Castagna
%T Covariance and Contravariance: Conflict without a Cause
%J ACM Transactions on Programming Languages and Systems (TOPLAS)
%V 17
%N 3
%D May 1995
%P 431-447

--
森 公一郎 (MORI Koichiro),  kmori@ca2.so-net.or.jp | kmori@lsi-j.co.jp
Technical Details
Message-ID: <57bqke$nk@applepie.kmori.ca2.so-net.or.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <87iv72eb3z.fsf@beer.tutkie.tut.ac.jp> <570vl1$i@yama15.yz.yamagata-u.ac.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: f5c49,2a15990f3661546d,start
X-Google-Attributes: gidf5c49,public
X-Google-Thread: 10b195,c65063034af2faa7
X-Google-Attributes: gid10b195,public
From: kmori@ca2.so-net.or.jp (MORI Koichiro)
Subject: Re: covariant and contravariant (Re: The lang I love.)
Date: 1996/11/25
Message-ID: <57bqke$nk@applepie.kmori.ca2.so-net.or.jp>
X-Deja-AN: 198570841
references: <87iv72eb3z.fsf@beer.tutkie.tut.ac.jp> <570vl1$i@yama15.yz.yamagata-u.ac.jp>
content-type: text/plain; charset=ISO-2022-JP
organization: Inagi-shi, Tokyo, Japan
mime-version: 1.0 (generated by tm-edit 7.75)
newsgroups: fj.lang.misc,fj.lang.functional