caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Anthony Tavener <anthony.tavener@gmail.com>
To: Ivan <ivg@ieee.org>
Cc: "caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] passing object to a function fails to compile (lablgtk2 involved)
Date: Mon, 16 Jul 2012 09:29:52 -0600	[thread overview]
Message-ID: <CAN=ouMSovxwz5UG3RxQBN-Zhg2YQAmj-8YE4uM35KOSZnPc5uA@mail.gmail.com> (raw)
In-Reply-To: <678391342421391@web21g.yandex.ru>

[-- Attachment #1: Type: text/plain, Size: 3240 bytes --]

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
>
>

[-- Attachment #2: Type: text/html, Size: 4161 bytes --]

  reply	other threads:[~2012-07-16 15:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-16  6:49 Ivan
2012-07-16 15:29 ` Anthony Tavener [this message]
2012-07-17  8:32   ` Ivan
2012-07-18 16:53     ` Olivier Andrieu

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='CAN=ouMSovxwz5UG3RxQBN-Zhg2YQAmj-8YE4uM35KOSZnPc5uA@mail.gmail.com' \
    --to=anthony.tavener@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=ivg@ieee.org \
    /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;
as well as URLs for NNTP newsgroup(s).