Hi, I'm writing a module that reimplements the option type without redirection. For that I'm mapping None to a value with all bits set to 0, the NULL pointer in C. For that I have a little helper function:
external make_null : unit -> 'a t = "caml_shallow_null" But now I want to also have a polymorphic value for NULL: module Make : sig type 'a t val make_list : unit -> 'a list val make_null : unit -> 'a t end = struct type 'a t let make_list () = [] external make_null : unit -> 'a t = "caml_shallow_null" end module Shallow : sig type 'a t val list : 'a list val null : 'a t end = struct type 'a t = 'a Make.t let list = Make.make_list () let null = Make.make_null () end File "shallow.ml", line 15, characters 6-102: Error: Signature mismatch: Modules do not match: sig type 'a t = 'a Make.t val list : 'a list val null : '_a Make.t end is not included in sig type 'a t val list : 'a list val null : 'a t end Values do not match: val null : '_a Make.t is not included in val null : 'a t What makes the Make.make_list differ from Make.make_null? Is there a way that I can specify that null is still polymorphic or does that only work for constructors like None and compiler magic like []? ---------------------------------------------------------------------- And here something odd: module Make : sig type 'a t = 'a list val make_list : unit -> 'a list val make_null : unit -> 'a t end = struct type 'a t = 'a list let make_list () = [] external make_null : unit -> 'a t = "caml_shallow_null" end module Shallow : sig type 'a t val list : 'a list val null : 'a t end = struct type 'a t = 'a Make.t let list = Make.make_list () let null = Make.make_null () end compiles fine. But module Make : sig type 'a t = private 'a list val make_list : unit -> 'a list val make_null : unit -> 'a t end = struct type 'a t = 'a list let make_list () = [] external make_null : unit -> 'a t = "caml_shallow_null" end module Shallow : sig type 'a t val list : 'a list val null : 'a t end = struct type 'a t = 'a Make.t let list = Make.make_list () let null = Make.make_null () end fails again. Just making the Make.t private makes it fail. MfG Goswin -- Caml-list mailing list. Subscription management and archives: https://sympa-roc.inria.fr/wws/info/caml-list Beginner's list: http://groups.yahoo.com/group/ocaml_beginners Bug reports: http://caml.inria.fr/bin/caml-bugs