Browse thread
Re: [Caml-list] Subtyping structurally-equivalent records, or something like it?
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Edgar Friendly <thelema314@g...> |
| Subject: | Re: [Caml-list] Re: Subtyping structurally-equivalent records, or something like it? |
On 05/04/2010 07:53 AM, Sylvain Le Gall wrote: > On 04-05-2010, AUGER Cédric<Cedric.Auger@lri.fr> wrote: >> type momentum = Moment of kinematic >> >> That is does the constructor introduce an overhead or not? >> As there is only one constructor, no overhead should be done in an >> optimized compiler. >> > This is not about optimized compiler in this case but about data > representation. Even if you use an optimized compiler (which is not > really the case with ocamlopt), you won't change datastructure > representation to optimize. > The OCaml compiler *could* special-case this kind of constructor, but as there's the syntax: type momentum = kinematic Which produces the non-boxed kinematic values, the authors probably decided to follow the maxim "Do what the programmer says" for singleton variant types. The question becomes whether phantom types solve this problem sufficiently or do we need another type-level construct - explicit subtyping relationships. Forever ago I suggested this to achieve a similar goal, and was given yet another solution: module M : sig type momentum val of_kin : kinematic -> momentum val to_kin : momentum -> kinematic end = struct type momentum = kinematic let of_kin x = x let to_kin x = x end Yes, it's a lot of boilerplate for each type, but you only have to write it once (per type), and cross-module inlining should give zero runtime cost. If not, use "%identity", and expose it in the interface. This method is along the lines of Anthony's proposal #4. E.