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 <ivg@ieee.org> 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