caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] How do I declare a value of 'a t instead of '_a t in a module?
@ 2012-05-05 15:37 Goswin von Brederlow
  2012-05-05 15:54 ` Gabriel Scherer
  0 siblings, 1 reply; 4+ messages in thread
From: Goswin von Brederlow @ 2012-05-05 15:37 UTC (permalink / raw)
  To: caml-list

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-05-06 10:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-05 15:37 [Caml-list] How do I declare a value of 'a t instead of '_a t in a module? Goswin von Brederlow
2012-05-05 15:54 ` Gabriel Scherer
2012-05-06 10:39   ` Goswin von Brederlow
2012-05-06 10:58     ` Gabriel Scherer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).