* [Caml-list] Constructors as functions and tuples in constructors
@ 2003-10-08 15:57 Serge
2003-10-08 16:07 ` Dan Grossman
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Serge @ 2003-10-08 15:57 UTC (permalink / raw)
To: caml-list
Gentlemen!
There are two features, which might it be useful to support in the
language w/out modifying it much. And they both are about greater
generality of the language.
First, it would be nice to have constructors as functions like below:
List. map Some [17]
Second, it would also be nice not to have "the concept of constructor
arity", and treat the code below as correct:
type t = A of int * int
let _ =
match A (17, 0) with
A z -> match z with (x, y) -> ()
Does anybody know, whether this is possible? Or, if not, what are the
prohibiting reasons?
-------------------------------------------------------------------------------
Serge S. Bityukov, Moscow State University, Dept of Mechanics and Mathematics
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 15:57 [Caml-list] Constructors as functions and tuples in constructors Serge
@ 2003-10-08 16:07 ` Dan Grossman
2003-10-08 16:33 ` Andreas Rossberg
2003-10-08 16:13 ` Michal Moskal
2003-10-08 16:25 ` Nicolas Cannasse
2 siblings, 1 reply; 9+ messages in thread
From: Dan Grossman @ 2003-10-08 16:07 UTC (permalink / raw)
To: Serge; +Cc: caml-list
Serge wrote:
> First, it would be nice to have constructors as functions like below:
>
> List. map Some [17]
Leads to strange error messages and is trivially circumventable (replace
Some with fun x -> Some x)
> Second, it would also be nice not to have "the concept of constructor
> arity", and treat the code below as correct:
>
> type t = A of int * int
> let _ =
> match A (17, 0) with
> A z -> match z with (x, y) -> ()
Works with type t = A of (int * int). You put the parens in. So the
choice is yours. The advantage of leaving them out is usually performance.
Others can give the long version of these answers...
--Dan
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 15:57 [Caml-list] Constructors as functions and tuples in constructors Serge
2003-10-08 16:07 ` Dan Grossman
@ 2003-10-08 16:13 ` Michal Moskal
2003-10-08 16:25 ` Nicolas Cannasse
2 siblings, 0 replies; 9+ messages in thread
From: Michal Moskal @ 2003-10-08 16:13 UTC (permalink / raw)
To: Serge; +Cc: caml-list
On Wed, Oct 08, 2003 at 07:57:03PM +0400, Serge wrote:
>
> Gentlemen!
Well, maybe there are some ladies here? :-)
[...]
> Second, it would also be nice not to have "the concept of constructor
> arity", and treat the code below as correct:
>
> type t = A of int * int
> let _ =
> match A (17, 0) with
> A z -> match z with (x, y) -> ()
Just need to use () after "of", like this:
# type t = A of (int * int);;
type t = A of (int * int)
# let _ = match A (17, 0) with A z -> z;;
- : int * int = (17, 0)
#
However constructing A of int * int takes one allocation (it's
<tag_of_a> <int> <int>), while A of (int * int) -- two (it's <tag_of_a>
<ptr_to_int_int>). Referencing it also takes one indirection more.
--
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 15:57 [Caml-list] Constructors as functions and tuples in constructors Serge
2003-10-08 16:07 ` Dan Grossman
2003-10-08 16:13 ` Michal Moskal
@ 2003-10-08 16:25 ` Nicolas Cannasse
2 siblings, 0 replies; 9+ messages in thread
From: Nicolas Cannasse @ 2003-10-08 16:25 UTC (permalink / raw)
To: Serge, caml-list
> Gentlemen!
>
> There are two features, which might it be useful to support in the
> language w/out modifying it much. And they both are about greater
> generality of the language.
>
> First, it would be nice to have constructors as functions like below:
>
> List. map Some [17]
This is only syntaxic sugar. First class constructors are easy to add to the
language, that's just a matter of will from the INRIA team to choose to add
it or not ( meaning : since they didn't put the feature in the language yet,
they might have good reasons to do so. ).
> Second, it would also be nice not to have "the concept of constructor
> arity", and treat the code below as correct:
>
> type t = A of int * int
> let _ =
> match A (17, 0) with
> A z -> match z with (x, y) -> ()
>
> Does anybody know, whether this is possible? Or, if not, what are the
> prohibiting reasons?
This is possible :
type t = A of (int * int)
Notice the difference :
- in the first case, you alloc a block with tag "A" of size 2
- in the second, you alloc a block with tag "A" of size 1 containing a tuple
(a block of size 2 with tag 0 containing the two ints). There is then one
more indirection in your integers access but the tuple can be returned
directly without any added allocation.
Nicolas Cannasse
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 16:07 ` Dan Grossman
@ 2003-10-08 16:33 ` Andreas Rossberg
2003-10-08 17:05 ` Dan Grossman
2003-10-08 18:28 ` Alain.Frisch
0 siblings, 2 replies; 9+ messages in thread
From: Andreas Rossberg @ 2003-10-08 16:33 UTC (permalink / raw)
To: caml-list
Dan Grossman wrote:
>
>> Second, it would also be nice not to have "the concept of constructor
>> arity", and treat the code below as correct:
>>
>> type t = A of int * int
>> let _ = match A (17, 0) with
>> A z -> match z with (x, y) -> ()
>
> Works with type t = A of (int * int). You put the parens in. So the
> choice is yours. The advantage of leaving them out is usually performance.
That is not true. It would be quite trivial for the compiler to translate
A z -> e
into the equivalent of
A(z1,z2) -> let z = (z1,z2) in e
without affecting performance of other programs in any way. Likewise,
A z
could be transformed into
let (z1,z2) = z in A(z1,z2)
instead of rejecting it. OTOH, your workaround certainly decreases
performance for type t, as other pointed out.
--
Andreas Rossberg, rossberg@ps.uni-sb.de
"Computer games don't affect kids; I mean if Pac Man affected us
as kids, we would all be running around in darkened rooms, munching
magic pills, and listening to repetitive electronic music."
- Kristian Wilson, Nintendo Inc.
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 16:33 ` Andreas Rossberg
@ 2003-10-08 17:05 ` Dan Grossman
2003-10-09 12:40 ` Andreas Rossberg
2003-10-08 18:28 ` Alain.Frisch
1 sibling, 1 reply; 9+ messages in thread
From: Dan Grossman @ 2003-10-08 17:05 UTC (permalink / raw)
To: Andreas Rossberg; +Cc: caml-list
A good point, with these rebuttals:
(1) A pattern-match would have the potential of allocating memory, which
some may judge poorly. But the compiler could warn about this.
(2) This transformation does require the type A carries is transparent.
So we still couldn't relax the "other" restriction that a signature
cannot hide an unparenthesized t1 * t2 variant.
(3) It's not clear how far this trivial transformation should be
generalized. For example, given
type t = A of int * int * int * int
which of these should we allow
A(1,2,3,4)
A((1,2,3,4))
A((1,2),(3,4))
A(1,(2,3),4)
...
--Dan
Andreas Rossberg wrote:
> Dan Grossman wrote:
>
>>
>>> Second, it would also be nice not to have "the concept of constructor
>>> arity", and treat the code below as correct:
>>>
>>> type t = A of int * int
>>> let _ = match A (17, 0) with
>>> A z -> match z with (x, y) -> ()
>>
>>
>> Works with type t = A of (int * int). You put the parens in. So the
>> choice is yours. The advantage of leaving them out is usually
>> performance.
>
>
> That is not true. It would be quite trivial for the compiler to translate
>
> A z -> e
>
> into the equivalent of
>
> A(z1,z2) -> let z = (z1,z2) in e
>
> without affecting performance of other programs in any way. Likewise,
>
> A z
>
> could be transformed into
>
> let (z1,z2) = z in A(z1,z2)
>
> instead of rejecting it. OTOH, your workaround certainly decreases
> performance for type t, as other pointed out.
>
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 16:33 ` Andreas Rossberg
2003-10-08 17:05 ` Dan Grossman
@ 2003-10-08 18:28 ` Alain.Frisch
2003-10-08 18:44 ` Marcin 'Qrczak' Kowalczyk
1 sibling, 1 reply; 9+ messages in thread
From: Alain.Frisch @ 2003-10-08 18:28 UTC (permalink / raw)
To: Andreas Rossberg; +Cc: caml-list
On Wed, 8 Oct 2003, Andreas Rossberg wrote:
> That is not true. It would be quite trivial for the compiler to translate
>
> A z -> e
>
> into the equivalent of
>
> A(z1,z2) -> let z = (z1,z2) in e
Maybe:
A _ as z -> e
would be enough (well, not for typechecking, of course) and avoid an extra
allocation. The idea is that any piece of code working on a pair (z1,z2)
can also work on A(z1,z2) since the runtime repsentation is the same,
except the tag which is not used.
-- Alain
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 18:28 ` Alain.Frisch
@ 2003-10-08 18:44 ` Marcin 'Qrczak' Kowalczyk
0 siblings, 0 replies; 9+ messages in thread
From: Marcin 'Qrczak' Kowalczyk @ 2003-10-08 18:44 UTC (permalink / raw)
To: caml-list
W liście z śro, 08-10-2003, godz. 20:28, Alain.Frisch@ens.fr pisze:
> The idea is that any piece of code working on a pair (z1,z2)
> can also work on A(z1,z2) since the runtime repsentation is the same,
> except the tag which is not used.
Equality would break.
--
__("< Marcin Kowalczyk
\__/ qrczak@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Caml-list] Constructors as functions and tuples in constructors
2003-10-08 17:05 ` Dan Grossman
@ 2003-10-09 12:40 ` Andreas Rossberg
0 siblings, 0 replies; 9+ messages in thread
From: Andreas Rossberg @ 2003-10-09 12:40 UTC (permalink / raw)
To: caml-list
Dan Grossman wrote:
>
> (1) A pattern-match would have the potential of allocating memory, which
> some may judge poorly. But the compiler could warn about this.
Good point, but I don't think anybody would really care.
> (2) This transformation does require the type A carries is transparent.
> So we still couldn't relax the "other" restriction that a signature
> cannot hide an unparenthesized t1 * t2 variant.
Of course, no change there.
> (3) It's not clear how far this trivial transformation should be
> generalized. For example, given
> type t = A of int * int * int * int
> which of these should we allow
> A(1,2,3,4)
> A((1,2,3,4))
> A((1,2),(3,4))
> A(1,(2,3),4)
> ...
Not sure what your getting at. OCaml makes otherwise redundant
parentheses around constructor argument types significant. That is a
hack to allow for a more efficient representation. The idea is to make
that hack as transparent as possible.
But that aim of course is unrelated to changing the meaning of the
multifix type operator * itself. So the first two of your examples
should certainly be legal (and they are already), while the others
should not, no more than
((1,2),(3,4)) : int * int * int * int (* eek! *)
(1,(2,3),4) : int * int * int * int (* ouch! *)
- Andreas
--
Andreas Rossberg, rossberg@ps.uni-sb.de
"Computer games don't affect kids; I mean if Pac Man affected us
as kids, we would all be running around in darkened rooms, munching
magic pills, and listening to repetitive electronic music."
- Kristian Wilson, Nintendo Inc.
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2003-10-09 12:44 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-10-08 15:57 [Caml-list] Constructors as functions and tuples in constructors Serge
2003-10-08 16:07 ` Dan Grossman
2003-10-08 16:33 ` Andreas Rossberg
2003-10-08 17:05 ` Dan Grossman
2003-10-09 12:40 ` Andreas Rossberg
2003-10-08 18:28 ` Alain.Frisch
2003-10-08 18:44 ` Marcin 'Qrczak' Kowalczyk
2003-10-08 16:13 ` Michal Moskal
2003-10-08 16:25 ` Nicolas Cannasse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox