Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Peng Zang <peng.zang@gmail.com>
To: caml-list@yquem.inria.fr
Subject: weird behavior with built-in ignore function (a bug?)
Date: Fri, 23 Nov 2007 11:09:44 -0500	[thread overview]
Message-ID: <200711231109.47460.peng.zang@gmail.com> (raw)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi all,

I have run into what appears to be very odd behavior with the built-in
function "ignore".  I will demonstrate below.  It's a little
complicated, but it's the smallest testcase I could make it:

# type 'a fruit = 'a
and 'b veggie = 'b
and ('a,'b) kitchen = { source : <make : 'a fruit>;
                        sink : <trans : 'a fruit -> 'b veggie>; }
;;

# let bar sink x = sink#trans x;;
val bar : < trans : 'a -> 'b; .. > -> 'a -> 'b = <fun>

# let foo src snk =
    let m = { source = src; sink = snk } in
      ignore (bar m.sink m.source#make);
      ignore (bar m.sink m.source#make);
      ()
;;
val foo : < make : 'a fruit > -> < trans : 'a fruit -> '_b veggie > -> unit = 
<fun>


Basically, we have two objects.  One is producing fruits (source) and
the other is transforming them into vegetables (sink).  Note the
inferred typesig of foo, it thinks the trans method returntype is '_b
veggie.  This seems strange.  I think it should return a fully
polymorphic 'b veggie.

To verify.  I now re-define foo without the use of ignore:

# let foo src snk =
    let m = { source = src; sink = snk } in
    let _ = bar m.sink m.source#make in
    let _ = bar m.sink m.source#make in
      ();;
val foo : < make : 'a fruit > -> < trans : 'a fruit -> 'b veggie > -> unit = 
<fun>

This time the return type for trans is fully polymorphic!  Using
ignore as in the first case broke something.

For a strange turn, I make my own ignore function and redefine foo
with that:

# let myignore x = ();;
val myignore : 'a -> unit = <fun>
# let foo src snk =
  let m = { source = src; sink = snk } in
    myignore (bar m.sink m.source#make);
    myignore (bar m.sink m.source#make);
    ()
;;
val foo : < make : 'a fruit > -> < trans : 'a fruit -> 'b veggie > -> unit = 
<fun>

This also yields returns a fully polymorphic veggie!  So it's
something unique to the build-in ignore function?

So now my puzzling question: what is going on?  What is wrong with the
build-in ignore function that would make it mess up the return type of
the trans method?  Is this a bug?

Thanks,

Peng

PS. I'm using OCaml 3.09.3, haven't tried with 3.10
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.7 (GNU/Linux)

iD8DBQFHRvtLfIRcEFL/JewRAlaUAKDILTX5yx7vsK0z8qRWFXMosywfUgCfcFqv
zfcI8DJ4qOuDzF+S3zsrFBM=
=fBnk
-----END PGP SIGNATURE-----


             reply	other threads:[~2007-11-23 16:09 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-23 16:09 Peng Zang [this message]
2007-11-23 16:19 ` [Caml-list] " Vincent Aravantinos
2007-11-24  0:31 ` Julien Moutinho
2007-11-24 18:48   ` Peng Zang
2007-11-25  6:05     ` Julien Moutinho
2007-11-25 14:21       ` Peng Zang

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=200711231109.47460.peng.zang@gmail.com \
    --to=peng.zang@gmail.com \
    --cc=caml-list@yquem.inria.fr \
    /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