Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
on objects, equality and playing nicely with the stdlib
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2008-05-29 (08:14)
From: Christophe Raffalli <christophe.raffalli@u...>
Subject: Re: [Caml-list] on objects, equality and playing nicely with the stdlib
Jon Harrop a écrit :
> On Thursday 29 May 2008 05:50:33 Peng Zang wrote:
>> Hello list,
>> Recently, in building some toy games, I've started using objects.  I've
>> been pleased with them and often find the subtyping convenient.
>> However, I've run into some issues with the standard physical equality of
>> objects that the (=) operator performs.  Namely, it makes several stdlib
>> modules difficult to use.  Modules that provides a polymorphic (generic)
>> interface such as Hashtbl, List, Stack, etc.. rely on the (=) operator. 
>> This is fine as long as it happens to be what I need.  The minute I
>> introduce my own equality however, things break down.
>> What is the best way to go about using the stdlib (or similar) when you
>> have your own equality function?  This problem almost never shows up if you
>> just stick with basic data types, but with objects you quickly run into it.
> Hi Peng,
> You can use the Hashtbl.Make functor to create hash tables using your own 
> equality (and hashing) function. Other than that, you're screwed: resort to 
> cut and paste from the stdlib.

Via Custom block (section 18.9.1 of the manual), you could create a functor
with the following shape (I did not check my syntax):

module type Quotient =
  type t
  type qt
  val class : t -> qt
  val get_representent : qt -> t

module type Equivalence =
  type t
  val compare : t -> t -> int

module Make_Quotient (R : Equivalence) : Quotient with type t = R.t

Such that (class x) builds a custom block with
the given compare as comparison function ...
You can add hash and serialization to the Equivalence type too ...

It is a pity we have to do that from C, this should be the default way
to bridge the gap between polymorphic comparison and specific comparison.
(and PML will provide a buildin class constructor in the near future).

Hope this helps,

Christophe Raffalli
Universite de Savoie
Batiment Le Chablais, bureau 21
73376 Le Bourget-du-Lac Cedex

tel: (33) 4 79 75 81 03
fax: (33) 4 79 75 87 42
IMPORTANT: this mail is signed using PGP/MIME
At least Enigmail/Mozilla, mutt or evolution
can check this signature. The public key is
stored on