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
[Caml-list] record declaration, SML
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2003-01-10 (07:43)
From: Alessandro Baretta <alex@b...>
Subject: Re: [Caml-list] record declaration, SML wrote:
> On Fri, 10 Jan 2003, Alessandro Baretta wrote:
>>So, in order to define just one value one needs to define an 
>>entire class as in the following example.
>>class f_one = object method f = 1 end
>>let res = C (new f_one)
> Is this such a big problem? I imagine we're more likely to provide a 
> smart constructor for t, something like 
>     let mkC o = C(o :> < f : int >)

No, it's not a bit problem. I was just wondering

> and just stuff any object with method f : int in there. If we only want there 
> to be one kind of thing, we're better off using a record. Of course, Daniel 
> doesn't have that option since he is discussing a syntactic transformation 
> from SML records into OCaml constructs, and hence using the class system makes 
> sense on account of the differences between SML record typing and that of 
> OCaml. 

Besides, Daniel showed us that you can actually define a 
record on the fly without cluttering the class namespace.

   let module M =
       class a = object val f = 1 method f = f end
   C (new M.a)

This raises one more question:
let module P =
	struct type t = { f : int } let x = { f = 1 } end
in P.x;;

The above is not valid Ocaml because P.x has a type which 
escapes its scope. This is quite evident. Now I would expect 
Daniel's code to be rejected by the same standards, but it 
is not. Why? Does class a not escape its scope?

>>BTW, why is something like the above not in the language? It 
>>seems only natural to have such a feature since an analogous 
>>construct exists for structs.
> There are no anonymous records (like SML has) either, so if you see classes as 
> analogous to records rather than structs it doesn't seem so unnatural. No, I 
> realize that's not a real explanation. 

Right. Even unnamed records are missing. But it's different 
because the Ocaml type system does not support record 
subtyping--even if record type b in module B defines all 
fields of record type a in module A with the same types, B 
is not a subtype of A. On the other hand, object subtyping 
exists already in the language, so on-the-fly definitions of 
objects à la façon de Daniel are more meaningful and useful.


To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: