Dear all, I have circumscribed my initial problem and I am able to produce it on a simple case. I have a signature Classdef.mli restrcted to class virtual ['a, 'b, 'c] cl0 : object constraint 'c = < m : 'a -> 'b -> int; .. > end class virtual ['a, 'b] cl1 : object method virtual m : 'a -> 'b -> int method virtual raise_trouble : 'a end class virtual ['a, 'b] cl2 : object method virtual as_cl0 : ('a, 'b, ('a, 'b) cl1) cl0 end then, in another module that contains only the following type declaration type refer = { poly : 'a 'b 'c . (('b, 'c) #Classdef.cl2 as 'a); } raise the error: File "anotherModule.ml", line 1, characters 0-1: Error: The implementation anotherModule.ml does not match the interface (inferred signature): Type declarations do not match: type refer = { poly : 'a 'b 'c. ('b, 'c) #Classdef.cl2 as 'a; } is not included in type refer = { poly : 'a 'b 'c. ('b, 'c) #Classdef.cl2 as 'a; } The types for field poly are not equal. Note that - if I suppress the method raise_trouble - or if neither 'a nor 'b appear in the type of this method, then everything works fine. Can someone explain to me this behavior? (the two files are in the attached tarball): . First, I don't understand which instances of type poly are compared: there is only one single definition of this type and no use. . And second, I don't understand why adding a method will change the behavior. Many thanks in advance, Jean-Louis Giavitto ------------------------------------------------------- Le 22/07/64 20:59, Jean-Louis Giavitto a écrit : > Hello. > if anyone could give me some hints on the following problem... > > > I have a file tt.ml which reduces to > > type typedef = { > isa : 'a 'rep 'cell . > (('rep, int, int, int, int, int) #Collection.collection as 'a); > } > > The mli file is exactly the same has the ml file. 'collection' is a > virtual class declared in file collection.ml and signature in > collection.mli. > > tt.ml compile without problems. However, if I replace (in tt.ml and > tt.mli) one of the 'int' parameter by a type variable: > > type typedef = { > isa : > 'a 'rep 'cell . > (('rep, 'cell, int, int, int, int) #Collection.collection > as 'a); > } > > then I have the following message (with the 4.0 compiler): > > File "tt.ml", line 1: > Error: The implementation tt.ml does not match the interface tt.cmi: > Type declarations do not match: > type typedef = { > isa : > 'a 'rep 'cell. > ('rep, 'cell, int, int, int, int) #Collection.collection as 'a; > } > is not included in > type typedef = { > isa : > 'a 'rep 'cell. > ('rep, 'cell, int, int, int, int) #Collection.collection as 'a; > } > File "tt.ml", line 2, characters 5-112: Actual declaration > The types for field isa are not equal. > > > - The problem appears with the compiler 3.12 but also 4.0 (a similar > error (5622) was reported but was not reproducible with 4.0). > - I have no problem if I drop the .mli file. > - The error seems sensitive to the definition of the class 'collection': > I was not able to reproduce it with a much simpler definition of > collection. > - I have the same error if I replace more 'int' parameter by type > variables. > > Have you any clues? > Jean-Louis Giavitto. -- Jean-Louis Giavitto Ircam CNRS UMR STMS 9912 – UPMC – Inria 1, place Igor Stravinsky, 75004 Paris http://repmus.ircam.fr/giavitto http://mgs.spatial-computing.org