caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Brian Rogoff <bpr@best.com>
To: Mattias Waldau <mattias.waldau@abc.se>
Cc: Caml-List <caml-list@inria.fr>
Subject: Re: Same label in different types, how do people solve this?
Date: Fri, 8 Dec 2000 08:36:08 -0800 (PST)	[thread overview]
Message-ID: <Pine.BSF.4.21.0012080834310.6785-100000@shell5.ba.best.com> (raw)
In-Reply-To: <HDEEKOMJILGEIHIMAPCDMEJMDLAA.mattias.waldau@abc.se>

Mattias Waldau wrote : 
> In Ocaml, you cannot have the same label in different types, see the
example
> below where point_2d hides point_3d.

Troublemaker :-). There is a thread on this topic on comp.lang.functional. 
Please, FAQ maintainer, this is very definitely FAQ material!

> Also, I am a bit curious why it doesn't help to type explicitely,
i.e. to
> write let x:point_3d={x=10.;y=20.;z=30.} ???

John Skaller and Jacques Garrigue answered this.

Maxence Guesdon wrote: 

> In your example, and without objects, I would have chosen explicit names
> for labels, i.e. :
> 
> type point_3d = {
>      p3d_x:float;
>      p3d_y:float;
>      p3d_z:float;
>    }
>  
> type point_2d = {
>      p2d_x:float;
>      p2d_y:float;
>    }
> 
> It sure is kind of a pain to write, but it is much more easy to
> understand when you read it. With

I very strongly disagree. If I didn't disagree, I'd probably also prefer
to annotate all of my functions in place with their types. Same principle, a
pain to write but somewhat easier to read. I don't agree with the principle
that more annotations means easier readability, and I've written a fair enough 
amount of Ada to believe that my opinion is not without some merit. I think 
annotating each field is way too verbose, even for the reader. My opinion
of course, feel free to differ. 

I do agree with the general Ada principle that you shouldn't be concerned 
with the writer of the code, but with the reader/maintainer. I guess one 
counterargument though is that code which is never written won't be
maintained anyways ;-).

Jacques Garrigue wrote:
> There are various ways. The most common is to differentiate label
> names (i.e. use x_3d and x_2d instead of x). Another more subtle one
> is to put the definitions in deifferent modules (Point2d and Point3d)
> so that you can specify exactly which label you want (Point2d.x or
> Point3d.x).

I prefer the module solution. 

> The last solution might be nicer if we had a
>     let open Module in
> construct (would require 10 lines in the compiler)

Yes, I would like something like this! There is a workaround, in which you
can use a local module and do your "open" in that. 

let module Top = struct open Module let f () = ... end in Top.f () 

but I think a cleaner syntax might be nice and I'm reluctant to use P4 in 
work projects until its status is clearer.

For this problem, you're still hosed if you want to use 2d and 3d points
in the same module, and don't want distinct labels. 

> Polymorphic variants cannot help, but if you do not care about
> efficiency you can use objects:

Maybe the efficient compilation of OO code deserves more attention,
especially for this case where we use classes just to get polymorphic
records. 

> > Also, I am a bit curious why it doesn't help to type explicitely,
i.e. to
> > write
> > let x:point_3d={x=10.;y=20.;z=30.} ???

> A very restrictive approach would still work: use type annotations,
> but only when they are directly on the creation/access/modification
> construct.
> 
> That is
>      ({x=1.;y=1.;z=1.}:point_3d)
>      let p : point_3d = {x=1.;y=1.;z=1.}
>      (p : point_3d).x
>      {p : point_3d with x = 2.}
>
> Here, there is no ambiguity at all. But this is very weak:
> 
>      let p : point_3d = {x=1.;y=1.;z=1.} in p.x +. p.y +. p.z
> 
> would still be illegal...

Yes, still pretty weak. My gut feeling is that putting the records in
separate modules and having a local open construct would be better, if
developers are dead set on preserving the principal type property. But,
maybe in combination with the local open this is "good enough"?

Pierre Weis wrote
> I would suggest another syntactic notation to specify the type to
> which a label belongs: label@@type.
> 
> {x@@p2d = 0; y = 5}
> r.x@@p2d

I don't want to start a syntax war, but I think Ocaml is already suffering
a bit from too much added syntax and this doesn't look good to me. Jacques' 
reuse of ":" (I know, it applies to the whole record and not a label) is 
easier on my eyes, which already associate ":" with typing. 

-- Brian





  parent reply	other threads:[~2000-12-11 17:19 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-12-06 21:22 Mattias Waldau
2000-12-07 16:49 ` John Max Skaller
2000-12-07 18:34 ` Maxence Guesdon
2000-12-07 23:02 ` Gerd Stolpmann
2000-12-08  1:22 ` Jacques Garrigue
2000-12-08  9:31   ` Sven LUTHER
2000-12-08  9:36     ` Pierre Weis
2000-12-08  9:48       ` Sven LUTHER
2000-12-08 18:41       ` John Max Skaller
2000-12-08  9:40     ` Nicolas barnier
2000-12-08 16:36 ` Brian Rogoff [this message]
2000-12-11 17:19   ` Pierre Weis
2000-12-10 12:49 ` Mattias Waldau
2000-12-11 18:23   ` Chris Hecker
2000-12-11 19:17     ` Pierre Weis
2000-12-12 10:02       ` Sven LUTHER
2000-12-12  3:25     ` Chet Murthy
2000-12-12 17:43       ` John Max Skaller
2000-12-12 19:24         ` Functions must be explicitly typed, (was Same label in different types, how do people solve this?) Mattias Waldau
2000-12-13  0:51           ` John Max Skaller
2000-12-15 10:13             ` Andreas Rossberg
2000-12-15 12:50             ` Frank Atanassow
2000-12-14 18:42           ` Stefan Monnier
2000-12-15 12:47             ` Pierre Weis
2000-12-15 13:39               ` Mattias Waldau
2000-12-15 23:37                 ` Brian Rogoff
2000-12-16 14:10                 ` ROverloading John Max Skaller
2000-12-15 21:51         ` Same label in different types, how do people solve this? Bruce Hoult
2000-12-12 17:19   ` John Max Skaller
2000-12-10 14:57 Ohad Rodeh
2000-12-13 13:17 Dave Berry
2000-12-13 14:31 ` Mattias Waldau
2000-12-15 10:01   ` John Max Skaller

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.4.21.0012080834310.6785-100000@shell5.ba.best.com \
    --to=bpr@best.com \
    --cc=caml-list@inria.fr \
    --cc=mattias.waldau@abc.se \
    /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).