Version française
Home     About     Download     Resources     Contact us    
Browse thread
A (Silly?) Question About Universal Type Quantification
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Will M Farr <farr@M...>
Subject: A (Silly?) Question About Universal Type Quantification
Hello,

I recently encountered a situation where I had (effectively) the  
following polymorphic type:

type 'a record = { id : int; data : 'a }

and the following compare function

let compare {id = id1} {id = id2} = Pervasives.compare id1 id2

and wanted to put such records into a set.  However, I could not  
figure out how to make the polymorphic 'a in the type definition  
"disappear" in the module argument to the Set.Make functor.  For  
example, the obvious

Set.Make(struct
   type t = 'a record
   let compare = compare
end)

fails because the 'a in the type definition for t is unbound.  Is  
there no way to do this?  I'm thinking of some sort of "forall"  
designation, which universally quantifies the type parameter, like

Set.Make(struct
   type t = forall 'a : 'a record
   let compare = compare
end)

(I'm sure that there is better terminology for this---please pardon my  
ignorance about types and type theory.)

I ended up solving my problem by placing the record type into a  
functor, whose argument specified the concrete type for data, but I'm  
curious if other solutions exist.

Thanks,
Will