Version française
Home     About     Download     Resources     Contact us    
Browse thread
Coercion of arrays of objects (and some other containers)
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Olivier Andrieu <andrieu@i...>
Subject: Re: [Caml-list] Coercion of arrays of objects (and some other containers)
 Matthieu Dubuget [Wed, 13 Apr 2005]:
 > I'm sorry, but I feel stupid.
 > 
 > The variance and covariance terms/notions appear often in this
 > list, and seems to be very basic notions.
 > 
 > I tried to find explanation on internet but did not succeed.
 > 
 > Could somebody point me some links  to understand, please?

I do not have a link but the idea (as I understand it) is simple :

This concerns parameterized types ('a t) and how a subtyping relation
on the parameter can yield a subtyping relation on the type.

When the parameter is covariant :
  if a is a subtype of b then a t is a subtype of b t

When the parameter is contravariant :
  if a is a subtype of b then b t is a subtype of a t

For instance lists are covariant. [`A|`B|`C] is a supertype of [`A|`B]
so a [`A|`B|`C] list is a supertype of [`A|`B] list.

Function arguments are contravariant : ([`A|`B] -> unit) is a
supertype of ([`A|`B|`C] -> unit). When you have a function that
accepts A B or C, you can also view it as a function that accepts just
A or B (qui peut le plus peut le moins).

Records with mutable fields (or arrays) are neither covariant nor
contravariant. 

Well maybe my terminology isn't quite correct but I hope you get the
idea.

-- 
   Olivier