Hi Ivan, I'm not an OCaml wizard, but I'll hazard a guess... Are your lines calling create_model and fill_model in a different module than where the functions are defined? (or called from the toplevel?) If so, it might be that the types at the module boundary are not constrained enough to be compatible? (apologies if my terminology is incorrect) If these functions are in a different module than the calls to them, you might need to define the module signature, using a consistent type for a "model". Sometimes two types are not equal, even though they *would* amount to the same underlying representation in a particular scenario. So, check the inferred types of your functions... you might need to add another hint to express what you want. When you roll everything into one function, the compiler has more information about how the values are used. ie., Usage provides another constraint for typing. -Tony On Mon, Jul 16, 2012 at 12:49 AM, Ivan wrote: > Excuse me for the topic formulation, but I cannot state it better. > > I have two simple functions: > > let fill_model model name_col value_col = > let pars = P.from_file "parallax.cfg" in > let add_record (name, value) = > let iter = model#append () in > model#set ~row:iter ~column:name_col name; > model#set ~row:iter ~column:value_col value > in List.iter add_record pars > > (where P.from_file some function generating an assoc list -> (string * > string) list ) > > and > > let create_model () = > let cols = new GTree.column_list in > let name_col = cols#add Gobject.Data.string > and value_col = cols#add Gobject.Data.string in > let model = GTree.list_store cols in > (model, name_col, value_col) > > When I try to pass values returned by function `create_model' to function > `fill_model' with the following expression: > > let model, name_col, value_col = create_model () in > fill_model model name_col value_col > > compiler refuses with: > > Error: This expression has type GTree.list_store > but an expression was expected of type > < append : unit -> Gtk.tree_iter; > set : row:Gtk.tree_iter -> column:'a -> Types.id -> unit; .. > > The universal variable 'b would escape its scope > > If I write the two functions in one, like this: > let fill_and_create_model () = > let cols = new GTree.column_list in > let name_col = cols#add Gobject.Data.string > and value_col = cols#add Gobject.Data.string in > let model = GTree.list_store cols in > let pars = P.resolve_links (P.from_file "parallax.cfg") in > let add_record (name, value) = > let iter = model#append () in > model#set ~row:iter ~column:name_col name; > model#set ~row:iter ~column:value_col "shit" > in List.iter add_record pars > > everything compiles without a notice. > > Please, can somebody explain me what I am doing wrong, and what is > "universal variable 'b" that escapes from its scope. > > Big thanks, in advance for any help! > > > -- > 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 > >