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
Recursive subtyping issue
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2010-03-02 (10:22)
From: Goswin von Brederlow <goswin-v-b@w...>
Subject: Re: [Caml-list] Recursive subtyping issue
"David Allsopp" <> writes:

> Goswin von Brederlow wrote:
>> "David Allsopp" <> writes:
>> > external foo_of_bar : bar -> foo = "%identity"
>> >
>> > in *both* the .ml and .mli file for the module in question. I'm
>> virtually certain that ocamlopt eliminates calls to the %identity
>> primitive.
>> Where is that documented?
> The use of external and its benefit in exported signatures is documented in
> Chapter 18 of the manual.
> I believe I became aware of the %identity special handling as a side-effect
> of the discussion in
> 5bef70f2496.en.html.
> If you look in asmcomp/ you'll see what I think is the elimination
> of Pidentity calls in the code generator.

Meaning it is not documented. :(

>> I would have written
>> let foo_of_bar (x : bar) = (x :> foo)
> We're solving two different problems, I think (as you're assuming that bar
> can be constrained to type foo) - I'm assuming that all type constraining is
> done in the signature of the interface so, without %identity I would simply
> have put [let foo_of_bar x = x] of type 'a -> 'a in my module... and then
> constrained it as [val foo_of_bar : bar -> foo] in the signature.
> It is possible that ocamlopt can recognise (obvious) identity functions as
> well, but that's just speculation on my part as I haven't looked.

It probably won't detect it as identity function but it probably always
inlines it and thereby eliminates it. I hope.