From: Hugo Ferreira <hmf@inescporto.pt>
To: caml-list@yquem.inria.fr
Subject: Shared types: circular dependency in modules with polymorphic type
Date: Thu, 14 May 2009 12:41:24 +0100 [thread overview]
Message-ID: <4A0C0364.7000408@inescporto.pt> (raw)
In-Reply-To: <4A0B2218.2050305@mcmaster.ca>
Hello,
I have again encountered a problem with sharing types.
However this time I really have a set of interfaces
which need to be "stitched" together via type sharing.
Problem is I am dealing with a circular polymorphic
type dependency. Or at least seems so. I have added the
very simple code for testing at the end. But the short
of it is: with the code below
module Make_P (VI : VB)
(UI : U)
(RI : R with type t = UI.t )
= struct
type instance = UI.instance
type t = UI.t
let do_something_nice null =
let vb0 = VI.empty in
let vb1 = VI.add vb0 UI.zero in
RI.do_something_else vb1 UI.one
end
I get the error:
This expression (vb1) has type UI.instance VI.t but is here used with type
RI.t = UI.t
vb1: UI.instance VI.t
The problem is that VI.t is polymorphic.
And UI uses VI.t setting the polymorphic
type in the process.
I want to make it "UI.instance VI.t."
How can I do that. I have tried:
module Make_P (VI : VB)
(UI : U with type t = U.instance VI.t)
(RI : R with type t = UI.t )
and
module Make_P (UI : U)
(VI : VB with type 'a t = UI.t)
(RI : R with type t = UI.t )
with no success.
--------------------- Code ---------------
module type VB = sig
type 'a t
val empty : 'a t
val add : 'a t -> 'a -> 'a t
end
module VB1 : VB
= struct
type 'a t = 'a list
let empty = []
let add l e = e :: l
end
module type U =
sig
type instance = int
type t
val zero : instance
val one : instance
val empty : t
val do_something : t -> instance -> t
end
module Make_U (Vb : VB)
= struct
type instance = int
type t = instance Vb.t
let zero = 0
let one = 1
let empty = Vb.empty
let do_something ts inst = Vb.add ts inst
end
module U1 = Make_U ( VB1 )
let _ =
let vb0 = VB1.empty in
let vb1 = VB1.add vb0 U1.zero in
let vb2 = U1.do_something vb1 U1.one in
let _ = VB1.add vb2 U1.zero in
()
module type R =
sig
type instance = int
type t
val do_something_else : t -> instance -> t
end
module Make_R (VI : VB)
(UI : U)
= struct
type instance = UI.instance
type t = UI.t
let do_something_else ts inst = UI.do_something ts inst
end
module R1 = Make_R ( VB1 ) ( U1 )
let _ =
let vb0 = VB1.empty in
let vb1 = VB1.add vb0 U1.zero in
let vb2 = R1.do_something_else vb1 U1.one in
let _ = VB1.add vb2 U1.zero in
()
module Make_P (VI : VB)
(UI : U)
(RI : R with type t = UI.t )
= struct
type instance = UI.instance
type t = UI.t
let do_something_nice null =
let vb0 = VI.empty in
let vb1 = VI.add vb0 UI.zero in
RI.do_something_else vb1 UI.one
end
module P1 = Make_P ( U1 ) ( VB1 ) ( R1 )
or
module P1 = Make_P ( VB1 ) ( U1 ) ( R1 )
next prev parent reply other threads:[~2009-05-14 11:41 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-13 19:12 Shared types: " Hugo Ferreira
2009-05-13 19:40 ` [Caml-list] " Jacques Carette
2009-05-14 7:58 ` Hugo Ferreira
2009-05-14 14:42 ` Andreas Rossberg
2009-05-14 15:06 ` Hugo Ferreira
2009-05-14 11:41 ` Hugo Ferreira [this message]
2009-05-14 12:11 ` [Caml-list] Shared types: circular " Peng Zang
2009-05-14 12:46 ` Hugo Ferreira
2009-05-14 13:20 ` Peng Zang
2009-05-14 13:28 ` Hugo Ferreira
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A0C0364.7000408@inescporto.pt \
--to=hmf@inescporto.pt \
--cc=caml-list@yquem.inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox