Browse thread
Recursive subtyping issue
[
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: | David Allsopp <dra-news@m...> |
| Subject: | RE: [Caml-list] Recursive subtyping issue |
Goswin von Brederlow wrote: > "David Allsopp" <dra-news@metastack.com> 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 http://caml.inria.fr/pub/ml-archives/caml-list/2007/04/200afc54d9796dbb7a8d7 5bef70f2496.en.html. If you look in asmcomp/cmmgen.ml you'll see what I think is the elimination of Pidentity calls in the code generator. > 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. David