Thanks. it helps. Here's what I really want, is there any way to walk around if not possible? S1 is not written by me. -------------------------------------------------------------------- module type S1 = sig module Inner : sig type 'a t val add : 'a t -> 'a t -> int end end let f1 (type s) (type a) (module Y : S1 with type s Inner.t = a) (y: s Y.Inner.t) = Y.Inner.add y y ------------------------------------------------------------------------------------------------------------ On Thu, Jun 7, 2012 at 11:22 PM, Jacques Garrigue < garrigue@math.nagoya-u.ac.jp> wrote: > On 2012/06/08, at 11:35, Hongbo Zhang wrote: > > > Hi, List > > I am not sure this is a bug or not? > > > > Below is a contrived example: > > ------------------ > > module type S = sig > > type t=int > > module X : sig type u end > > end > > > > let f ( module X : S) (y:X.X.u) = > > 3 > > -------------------- > > Error: This pattern matches values of type X.X.u > > but a pattern was expected which matches values of type X.X.u > > The type constructor X.X.u would escape its scope > > -- Thanks > > Definitely, this is not a bug. > Type X.X.u is abstract, and showing it outside (as by taking an argument > of that type) would be meaningless. > > What you might have meant is: > > let f (type a) (module X : S with type X.u = a) (y : X.X.u) = 3 > > This is typable (but I'm not sure it means anything...) > > Jacques Garrigue > -- -- Bob