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