caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Patrick M Doane <patrick@watson.org>
To: Chris Hecker <checker@d6.com>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] variant with tuple arg in pattern match?
Date: Wed, 4 Apr 2001 15:18:38 -0400 (EDT)	[thread overview]
Message-ID: <Pine.BSF.3.96.1010404150612.5769A-100000@fledge.watson.org> (raw)
In-Reply-To: <4.3.2.7.2.20010404034802.0334fae0@shell16.ba.best.com>

Hi Chris,

You'll need to change your type declaration from

  type foo = Foo of int * int

to

  type foo = Foo of (int * int)

or

  type bar = int * int
  type foo = Foo of bar

Caml performs some optimizations on the representation of tuples to place
the arguments for the constructor as well as constructor name into one
word of memory.  This can be a big win, both in memory usage and in access
time because one pointer access is removed.

It makes this distinction syntactically in the type declarations.  In the
first case, the memory layout for values of type foo would be: 

   [ tag word | int1 | int2 ]

where the second case would be

   [ tag word |  pointer ]  ->  [ tag word | int1 | int2 ]

I would certainly like it if Caml could:

  1) Treat this entirely as an optimization issue and not make a syntactic
distinction.

  2) Be able to make reasonable choices about which representation would
be more appropriate.

I doubt that it would do as well as the programmer could and it certainly
would take a bit of effort without a real clear improvement.

On the other hand, left with the syntactic distincation, a possible
improvement would be to make a distinction between

  type foo = Foo of bar

and 

  type foo = Foo of (bar)

so that "equational reasoning" could hold with regard to type
declarations. On several occasions, I have been tempted not to create
another type declaration because of this representation issue.

Hope this helps

Patrick

On Wed, 4 Apr 2001, Chris Hecker wrote:

> 
> I can't find anything about this in the docs, faq, or list archives.
> 
> I expected ii to be bound to the int * int tuple (1,2) in this pattern match:
> 
> # type foo = Foo of int * int;;
> type foo = Foo of int * int
> #   match Foo (1,2) with Foo ii -> ii ;;
> Characters 23-29:
> The constructor Foo expects 2 argument(s),
> but is here applied to 1 argument(s)
> 
> 
> This works:
> 
> # match Foo (1,2) with Foo _ -> () ;;
> - : unit = ()
> 
> But I can't get an "as" clause to work, either:
> 
> # match Foo (1,2) with Foo ((_,_) as ii) -> ii ;;
> Characters 21-38:
> The constructor Foo expects 2 argument(s),
> but is here applied to 1 argument(s)
> 
> But, even if the "as" worked, it's messy compared to the top method.
>  
> Chris
> 
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr
> 

-------------------
To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr


  parent reply	other threads:[~2001-04-04 19:18 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-04-04 11:04 Chris Hecker
2001-04-04 18:47 ` Alain Frisch
2001-04-04 19:18 ` Patrick M Doane [this message]
2001-04-04 19:36   ` Chris Hecker
2001-04-04 19:49     ` Daniel de Rauglaudre
2001-04-05  8:19       ` Christian RINDERKNECHT
2001-04-04 19:49     ` Patrick M Doane
2001-04-06 13:52   ` Xavier Leroy
2001-04-07  1:42     ` Patrick M Doane
2001-04-07  6:44       ` Daniel de Rauglaudre
2001-04-07  7:42     ` Fergus Henderson
2001-04-08 19:45       ` Pierre Weis
2001-04-08 20:37         ` Charles Martin
2001-04-08 23:57         ` Brian Rogoff
2001-04-09  0:22           ` Alain Frisch
2001-04-09 16:07             ` Pierre Weis
2001-04-10  8:23               ` Michel Mauny
2001-04-10  9:14                 ` Xavier Leroy
2001-04-10 10:09                   ` Michel Mauny
2001-04-10 10:44                 ` reig
2001-04-10 11:32                   ` Michel Mauny
2001-04-10 11:47                     ` reig
2001-04-10 12:10                       ` reig
2001-04-10 12:35                         ` Michel Mauny
2001-04-10 12:49                         ` Marcin 'Qrczak' Kowalczyk
2001-04-09  6:23           ` Mattias Waldau
2001-04-09  7:34             ` Daniel de Rauglaudre
2001-04-09 15:57           ` Pierre Weis
2001-04-10  9:07             ` Sven LUTHER
2001-04-09  8:20         ` Christian RINDERKNECHT
2001-04-10  2:54         ` Patrick M Doane
2001-04-10 19:04           ` John Max Skaller
2001-04-08  0:22 jgm
2001-04-10 12:17 Dave Berry
2001-04-10 13:12 ` Marcin 'Qrczak' Kowalczyk
2001-04-10 21:26   ` Bruce Hoult
2001-04-10 22:34     ` John Prevost
2001-04-10 13:51 ` Frank Atanassow
2001-04-10 17:25 Dave Berry
2001-04-10 23:16 ` Marcin 'Qrczak' Kowalczyk
2001-04-10 17:33 Dave Berry
2001-04-10 22:34 ` John Prevost

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=Pine.BSF.3.96.1010404150612.5769A-100000@fledge.watson.org \
    --to=patrick@watson.org \
    --cc=caml-list@inria.fr \
    --cc=checker@d6.com \
    /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).