caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Newbie comment on constructor syntax
@ 2015-11-06  9:33 Soegtrop, Michael
  2015-11-06 10:04 ` Nicolas Ojeda Bar
                   ` (3 more replies)
  0 siblings, 4 replies; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-06  9:33 UTC (permalink / raw)
  To: caml-list

Dear Ocaml users,

I just started to develop in OCaml, and must say it is smoother than expected. Although I did C/C++ for decades, I do less errors in Ocaml, both syntactically and in terms of if programs behave as expected. It appears to be much closer to human thinking than C/C++ and I already wonder how I could live without currying and type inference before.

The one thing I find rather non intuitive is that variant constructors can take only one argument - or a tuple. Although I know it is wrong, I always write "Constr a b" instead of "Constr (a, b)". I know syntax is only a minor thing and mostly a matter of taste, but a large fraction of my syntax errors in new code are of this kind (when modifying code it is a bit different). Somehow I think this doesn't go together well with the function call syntax of OCaml. I guess deep in my brain a constructor is a function which takes arguments and returns an element of the type it constructs, so I guess I want to use the usual function call syntax.

My question: Is there some syntax to give a constructor more than one argument which escaped me? Something like if I leave away the * in the definition I can use usual function call syntax in constructions and expressions? I would find this easier to read and to write, especially in matches or nested constructs. Does everybody use camlp4/p5/ppx to customize the syntax to his liking (as chapter 5 of the camlp4 manual suggests)? Or are there some long term advantages of this syntax I don't see as yet?

Best regards,

Michael

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06  9:33 [Caml-list] Newbie comment on constructor syntax Soegtrop, Michael
@ 2015-11-06 10:04 ` Nicolas Ojeda Bar
  2015-11-06 10:31 ` Francois Berenger
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 47+ messages in thread
From: Nicolas Ojeda Bar @ 2015-11-06 10:04 UTC (permalink / raw)
  To: Soegtrop, Michael, caml-list

Dear Michael,

No, there is no such syntax.  See

http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.en.html

for more information.

Kind regards,
Nicolas

On 11/6/2015 10:33 AM, Soegtrop, Michael wrote:
> Dear Ocaml users,
>
> I just started to develop in OCaml, and must say it is smoother than expected. Although I did C/C++ for decades, I do less errors in Ocaml, both syntactically and in terms of if programs behave as expected. It appears to be much closer to human thinking than C/C++ and I already wonder how I could live without currying and type inference before.
>
> The one thing I find rather non intuitive is that variant constructors can take only one argument - or a tuple. Although I know it is wrong, I always write "Constr a b" instead of "Constr (a, b)". I know syntax is only a minor thing and mostly a matter of taste, but a large fraction of my syntax errors in new code are of this kind (when modifying code it is a bit different). Somehow I think this doesn't go together well with the function call syntax of OCaml. I guess deep in my brain a constructor is a function which takes arguments and returns an element of the type it constructs, so I guess I want to use the usual function call syntax.
>
> My question: Is there some syntax to give a constructor more than one argument which escaped me? Something like if I leave away the * in the definition I can use usual function call syntax in constructions and expressions? I would find this easier to read and to write, especially in matches or nested constructs. Does everybody use camlp4/p5/ppx to customize the syntax to his liking (as chapter 5 of the camlp4 manual suggests)? Or are there some long term advantages of this syntax I don't see as yet?
>
> Best regards,
>
> Michael
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06  9:33 [Caml-list] Newbie comment on constructor syntax Soegtrop, Michael
  2015-11-06 10:04 ` Nicolas Ojeda Bar
@ 2015-11-06 10:31 ` Francois Berenger
  2015-11-06 12:20   ` Soegtrop, Michael
  2015-11-06 12:29 ` [Caml-list] Newbie comment on constructor syntax Jonas Jensen
  2015-11-08 21:16 ` Florian Weimer
  3 siblings, 1 reply; 47+ messages in thread
From: Francois Berenger @ 2015-11-06 10:31 UTC (permalink / raw)
  To: caml-list

On 11/06/2015 10:33 AM, Soegtrop, Michael wrote:
> Dear Ocaml users,
>
> I just started to develop in OCaml, and must say it is smoother than expected. Although I did C/C++ for decades, I do less errors in Ocaml, both syntactically and in terms of if programs behave as expected. It appears to be much closer to human thinking than C/C++ and I already wonder how I could live without currying and type inference before.
>
> The one thing I find rather non intuitive is that variant constructors can take only one argument - or a tuple. Although I know it is wrong, I always write "Constr a b" instead of "Constr (a, b)". I know syntax is only a minor thing and mostly a matter of taste, but a large fraction of my syntax errors in new code are of this kind (when modifying code it is a bit different). Somehow I think this doesn't go together well with the function call syntax of OCaml. I guess deep in my brain a constructor is a function which takes arguments and returns an element of the type it constructs, so I guess I want to use the usual function call syntax.
>
> My question: Is there some syntax to give a constructor more than one argument which escaped me? Something like if I leave away the * in the definition I can use usual function call syntax in constructions and expressions? I would find this easier to read and to write, especially in matches or nested constructs. Does everybody use camlp4/p5/ppx to customize the syntax to his liking (as chapter 5 of the camlp4 manual suggests)? Or are there some long term advantages of this syntax I don't see as yet?

A dummy suggestion, but maybe you will like it:

let constr a b = Constr (a, b)

> Best regards,
>
> Michael
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
>

-- 
Regards,
Francois.
"When in doubt, use more types"

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 10:31 ` Francois Berenger
@ 2015-11-06 12:20   ` Soegtrop, Michael
  2015-11-06 12:34     ` Gabriel Scherer
  0 siblings, 1 reply; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-06 12:20 UTC (permalink / raw)
  To: Francois Berenger, caml-list

Dear Francois,

> let constr a b = Constr (a, b)

unfortunately this won't work for matches. I will see if I get used to this. If not I will take this as a reason to learn p5 and/or ppx :-)

Best regards,

Michael 
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06  9:33 [Caml-list] Newbie comment on constructor syntax Soegtrop, Michael
  2015-11-06 10:04 ` Nicolas Ojeda Bar
  2015-11-06 10:31 ` Francois Berenger
@ 2015-11-06 12:29 ` Jonas Jensen
  2015-11-06 12:46   ` Soegtrop, Michael
  2015-11-08 21:16 ` Florian Weimer
  3 siblings, 1 reply; 47+ messages in thread
From: Jonas Jensen @ 2015-11-06 12:29 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: caml-list

If you're feeling adventurous, you can try Jun Furuse's ppx extension
that enables curried and partially-applied constructors:
https://bitbucket.org/camlspotter/ppx_curried_constr

On 6 November 2015 at 10:33, Soegtrop, Michael
<michael.soegtrop@intel.com> wrote:
>
> Dear Ocaml users,
>
> I just started to develop in OCaml, and must say it is smoother than expected. Although I did C/C++ for decades, I do less errors in Ocaml, both syntactically and in terms of if programs behave as expected. It appears to be much closer to human thinking than C/C++ and I already wonder how I could live without currying and type inference before.
>
> The one thing I find rather non intuitive is that variant constructors can take only one argument - or a tuple. Although I know it is wrong, I always write "Constr a b" instead of "Constr (a, b)". I know syntax is only a minor thing and mostly a matter of taste, but a large fraction of my syntax errors in new code are of this kind (when modifying code it is a bit different). Somehow I think this doesn't go together well with the function call syntax of OCaml. I guess deep in my brain a constructor is a function which takes arguments and returns an element of the type it constructs, so I guess I want to use the usual function call syntax.
>
> My question: Is there some syntax to give a constructor more than one argument which escaped me? Something like if I leave away the * in the definition I can use usual function call syntax in constructions and expressions? I would find this easier to read and to write, especially in matches or nested constructs. Does everybody use camlp4/p5/ppx to customize the syntax to his liking (as chapter 5 of the camlp4 manual suggests)? Or are there some long term advantages of this syntax I don't see as yet?
>
> Best regards,
>
> Michael
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 12:20   ` Soegtrop, Michael
@ 2015-11-06 12:34     ` Gabriel Scherer
  2015-11-06 13:09       ` Soegtrop, Michael
  2015-11-21 17:24       ` [Caml-list] Notation for currying Hendrik Boom
  0 siblings, 2 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-06 12:34 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: Francois Berenger, caml-list

[-- Attachment #1: Type: text/plain, Size: 2235 bytes --]

The use of camlp{4,5} to change OCaml syntax has always had extremely low
adoption, with some very specific exceptions (notably the lwt-support
syntax of the Ocsigen project). I suspect that this is due to the fact that
integrating a new syntax extension to your project has historically caused
more build-system and deployment trouble than people were willing to
tolerate.

ppx extensions are not designed to allow extending the OCaml syntax, and in
particular I think they are not a good fit for what you are looking for. It
is a large part of their appeal: by being less flexible, they are simpler
and more robust.

I personally believe that currified constructor syntax would be a better
choice, and that using non-currified constructors is a historical mistake
of SML/Caml. But I am also not convinced that efforts to change it today
are worth the trouble, and prefer to concentrate on improving other parts
of the OCaml ecosystem.

Another thing that was touched by your comments is the usefulness of
user-defined patterns (pattern synonyms). I have conflicted opinions on the
question of whether adding pattern synonyms would be a good thing, but
described one aspect of a proposal that I like (but also highlights that
the feature can be a source of implementation complexity) in
  http://gallium.inria.fr/blog/pattern-synonyms-as-expressions/

On Fri, Nov 6, 2015 at 1:20 PM, Soegtrop, Michael <
michael.soegtrop@intel.com> wrote:

> Dear Francois,
>
> > let constr a b = Constr (a, b)
>
> unfortunately this won't work for matches. I will see if I get used to
> this. If not I will take this as a reason to learn p5 and/or ppx :-)
>
> Best regards,
>
> Michael
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 3244 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 12:29 ` [Caml-list] Newbie comment on constructor syntax Jonas Jensen
@ 2015-11-06 12:46   ` Soegtrop, Michael
  2015-11-06 12:54     ` Gabriel Scherer
  0 siblings, 1 reply; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-06 12:46 UTC (permalink / raw)
  To: Jonas Jensen; +Cc: caml-list

Dear Jonas,

thanks for the link! It is interesting that others feel enough pain to write 200k of code to get a nicer and more flexible constructor syntax. Also interesting that it takes > 200k of code to do this even with ppx. And I am not sure if this would works for matches - at least there are none in the test files. For sure I need to gather a bit more experience before I dig into this.

Best regards,

Michael
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 12:46   ` Soegtrop, Michael
@ 2015-11-06 12:54     ` Gabriel Scherer
  0 siblings, 0 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-06 12:54 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: Jonas Jensen, caml-list

[-- Attachment #1: Type: text/plain, Size: 1734 bytes --]

The implementation technique used by Jun Furuse is to duplicate the
implementation of the type-checker, and change only the parts that
type-check constructor applications. This is the least-constraining way to
write type-aware transformations as ppx extensions. A more concise way is
to call compiler-libs for type-checking and postprocess the resulting typed
AST, but this is only reasonable if the input source is expected to be
well-typed.

(There are few limit on the kind of transformations you can do if you are,
in fact, willing to fork the compiler codebase if necessary. But, as Jonas
Jensen mentioned, this is "adventurous" indeed.)

On Fri, Nov 6, 2015 at 1:46 PM, Soegtrop, Michael <
michael.soegtrop@intel.com> wrote:

> Dear Jonas,
>
> thanks for the link! It is interesting that others feel enough pain to
> write 200k of code to get a nicer and more flexible constructor syntax.
> Also interesting that it takes > 200k of code to do this even with ppx. And
> I am not sure if this would works for matches - at least there are none in
> the test files. For sure I need to gather a bit more experience before I
> dig into this.
>
> Best regards,
>
> Michael
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 2574 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 12:34     ` Gabriel Scherer
@ 2015-11-06 13:09       ` Soegtrop, Michael
  2015-11-06 14:10         ` Ashish Agarwal
  2015-11-21 17:24       ` [Caml-list] Notation for currying Hendrik Boom
  1 sibling, 1 reply; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-06 13:09 UTC (permalink / raw)
  To: Gabriel Scherer; +Cc: caml-list

[-- Attachment #1: Type: text/plain, Size: 2339 bytes --]

Dear Gabriel,

thanks for the link, an interesting idea and discussion! And I see that maybe I should come over to Paris to participate ;-) I would agree with Alain Frisch’s final comment that whenever a pattern synonym is used in the RHS, there should be an explicit binder. This would either solve the “trouble” case or make the similarity to (x, x) obvious.

Best regards,

Michael

From: caml-list-request@inria.fr [mailto:caml-list-request@inria.fr] On Behalf Of Gabriel Scherer
Sent: Friday, November 06, 2015 1:34 PM
To: Soegtrop, Michael
Cc: Francois Berenger; caml-list@inria.fr
Subject: Re: [Caml-list] Newbie comment on constructor syntax

The use of camlp{4,5} to change OCaml syntax has always had extremely low adoption, with some very specific exceptions (notably the lwt-support syntax of the Ocsigen project). I suspect that this is due to the fact that integrating a new syntax extension to your project has historically caused more build-system and deployment trouble than people were willing to tolerate.
ppx extensions are not designed to allow extending the OCaml syntax, and in particular I think they are not a good fit for what you are looking for. It is a large part of their appeal: by being less flexible, they are simpler and more robust.
I personally believe that currified constructor syntax would be a better choice, and that using non-currified constructors is a historical mistake of SML/Caml. But I am also not convinced that efforts to change it today are worth the trouble, and prefer to concentrate on improving other parts of the OCaml ecosystem.
Another thing that was touched by your comments is the usefulness of user-defined patterns (pattern synonyms). I have conflicted opinions on the question of whether adding pattern synonyms would be a good thing, but described one aspect of a proposal that I like (but also highlights that the feature can be a source of implementation complexity) in
  http://gallium.inria.fr/blog/pattern-synonyms-as-expressions/
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

[-- Attachment #2: Type: text/html, Size: 6158 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 13:09       ` Soegtrop, Michael
@ 2015-11-06 14:10         ` Ashish Agarwal
  2015-11-06 15:19           ` Soegtrop, Michael
  0 siblings, 1 reply; 47+ messages in thread
From: Ashish Agarwal @ 2015-11-06 14:10 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: Gabriel Scherer, caml-list

[-- Attachment #1: Type: text/plain, Size: 4018 bytes --]

You might be interested in:
https://github.com/janestreet/ppx_variants_conv

Example:

$ utop
utop # #require "ppx_deriving";;
utop # #require "ppx_variants_conv";;
utop # #require "variantslib";;

type t = A of int | C of int * int [@@deriving variants];;
type t = A of int | C of int * int
val c : int -> int -> t = <fun>
val a : int -> t = <fun>

module Variants :
  sig
    val c : (int -> int -> t) Variantslib.Variant.t
    val a : (int -> t) Variantslib.Variant.t
    val fold :
      init:'a ->
      a:('a -> (int -> t) Variantslib.Variant.t -> 'b) ->
      c:('b -> (int -> int -> t) Variantslib.Variant.t -> 'c) -> 'c
    val iter :
      a:((int -> t) Variantslib.Variant.t -> 'a) ->
      c:((int -> int -> t) Variantslib.Variant.t -> 'b) -> 'b
    val map :
      t ->
      a:((int -> t) Variantslib.Variant.t -> int -> 'a) ->
      c:((int -> int -> t) Variantslib.Variant.t -> int -> int -> 'a) -> 'a
    val descriptions : (string * int) list
  end

(I'm not quite sure why you have to do three #require statements manually.
Related to this <https://github.com/janestreet/ppx_sexp_conv/issues/1>.)


> Does everybody use camlp4/p5/ppx to customize the syntax to his liking

Note that the community is moving to ppx based syntax extensions, and away
from camlp4/5.

> 200k of code

Where do you see that much code? I only see 6000 lines of code.



On Fri, Nov 6, 2015 at 8:09 AM, Soegtrop, Michael <
michael.soegtrop@intel.com> wrote:

> Dear Gabriel,
>
>
>
> thanks for the link, an interesting idea and discussion! And I see that
> maybe I should come over to Paris to participate ;-) I would agree with
> Alain Frisch’s final comment that whenever a pattern synonym is used in the
> RHS, there should be an explicit binder. This would either solve the
> “trouble” case or make the similarity to (x, x) obvious.
>
>
>
> Best regards,
>
>
>
> Michael
>
>
>
> *From:* caml-list-request@inria.fr [mailto:caml-list-request@inria.fr] *On
> Behalf Of *Gabriel Scherer
> *Sent:* Friday, November 06, 2015 1:34 PM
> *To:* Soegtrop, Michael
> *Cc:* Francois Berenger; caml-list@inria.fr
> *Subject:* Re: [Caml-list] Newbie comment on constructor syntax
>
>
>
> The use of camlp{4,5} to change OCaml syntax has always had extremely low
> adoption, with some very specific exceptions (notably the lwt-support
> syntax of the Ocsigen project). I suspect that this is due to the fact that
> integrating a new syntax extension to your project has historically caused
> more build-system and deployment trouble than people were willing to
> tolerate.
>
> ppx extensions are not designed to allow extending the OCaml syntax, and
> in particular I think they are not a good fit for what you are looking for.
> It is a large part of their appeal: by being less flexible, they are
> simpler and more robust.
>
> I personally believe that currified constructor syntax would be a better
> choice, and that using non-currified constructors is a historical mistake
> of SML/Caml. But I am also not convinced that efforts to change it today
> are worth the trouble, and prefer to concentrate on improving other parts
> of the OCaml ecosystem.
>
> Another thing that was touched by your comments is the usefulness of
> user-defined patterns (pattern synonyms). I have conflicted opinions on the
> question of whether adding pattern synonyms would be a good thing, but
> described one aspect of a proposal that I like (but also highlights that
> the feature can be a source of implementation complexity) in
>   http://gallium.inria.fr/blog/pattern-synonyms-as-expressions/
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>

[-- Attachment #2: Type: text/html, Size: 7948 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 14:10         ` Ashish Agarwal
@ 2015-11-06 15:19           ` Soegtrop, Michael
  2015-11-06 15:21             ` Ashish Agarwal
  0 siblings, 1 reply; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-06 15:19 UTC (permalink / raw)
  To: Ashish Agarwal; +Cc: caml-list

[-- Attachment #1: Type: text/plain, Size: 615 bytes --]

Dear Ashish,

thanks, the features of this extension like mapping and iteration are very interesting!

> 200k of code

Where do you see that much code? I only see 6000 lines of code.

I was referring to the size in bytes, which appears to be a bit more than 200k.

Best regards,

Michael
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

[-- Attachment #2: Type: text/html, Size: 4670 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06 15:19           ` Soegtrop, Michael
@ 2015-11-06 15:21             ` Ashish Agarwal
  0 siblings, 0 replies; 47+ messages in thread
From: Ashish Agarwal @ 2015-11-06 15:21 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: caml-list

[-- Attachment #1: Type: text/plain, Size: 187 bytes --]

On Fri, Nov 6, 2015 at 10:19 AM, Soegtrop, Michael <
michael.soegtrop@intel.com> wrote:


> I was referring to the size in bytes, which appears to be a bit more than
> 200k.
>

Oh right.

[-- Attachment #2: Type: text/html, Size: 849 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-06  9:33 [Caml-list] Newbie comment on constructor syntax Soegtrop, Michael
                   ` (2 preceding siblings ...)
  2015-11-06 12:29 ` [Caml-list] Newbie comment on constructor syntax Jonas Jensen
@ 2015-11-08 21:16 ` Florian Weimer
  2015-11-08 22:50   ` Norman Hardy
  3 siblings, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2015-11-08 21:16 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: caml-list

* Michael Soegtrop:

> The one thing I find rather non intuitive is that variant constructors
> can take only one argument - or a tuple.

Curiously, the argument is not really a tuple.  This does not work:

type x = X of int * int
let c = (1, 2) in X c

> Although I know it is wrong, I always write "Constr a b" instead of
> "Constr (a, b)". I know syntax is only a minor thing and mostly a
> matter of taste, but a large fraction of my syntax errors in new
> code are of this kind (when modifying code it is a bit different).

Maybe it is possible to teach your editor some semantic syntax
highlighting, so that it flags this while typing?

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-08 21:16 ` Florian Weimer
@ 2015-11-08 22:50   ` Norman Hardy
  2015-11-09  6:27     ` Florian Weimer
  2015-11-09  8:09     ` Soegtrop, Michael
  0 siblings, 2 replies; 47+ messages in thread
From: Norman Hardy @ 2015-11-08 22:50 UTC (permalink / raw)
  To: Florian Weimer; +Cc: Soegtrop, Michael, caml-list


> On 2015 Nov 8, at 13:16 , Florian Weimer <fw@deneb.enyo.de> wrote:
> 
> * Michael Soegtrop:
> 
>> The one thing I find rather non intuitive is that variant constructors
>> can take only one argument - or a tuple.
> 
> Curiously, the argument is not really a tuple.  This does not work:
> 
> type x = X of int * int
> let c = (1, 2) in X c

However the following works:
# type x  = X of (int * int);;
type x = X of (int * int)
# let c = (1, 2) in X c;;
- : x = X (1, 2)



^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-08 22:50   ` Norman Hardy
@ 2015-11-09  6:27     ` Florian Weimer
  2015-11-09 13:27       ` Stefan Monnier
  2015-11-09  8:09     ` Soegtrop, Michael
  1 sibling, 1 reply; 47+ messages in thread
From: Florian Weimer @ 2015-11-09  6:27 UTC (permalink / raw)
  To: Norman Hardy; +Cc: Soegtrop, Michael, caml-list

* Norman Hardy:

>> On 2015 Nov 8, at 13:16 , Florian Weimer <fw@deneb.enyo.de> wrote:
>> 
>> * Michael Soegtrop:
>> 
>>> The one thing I find rather non intuitive is that variant constructors
>>> can take only one argument - or a tuple.
>> 
>> Curiously, the argument is not really a tuple.  This does not work:
>> 
>> type x = X of int * int
>> let c = (1, 2) in X c
>
> However the following works:
> # type x  = X of (int * int);;
> type x = X of (int * int)
> # let c = (1, 2) in X c;;
> - : x = X (1, 2)

With multiple constructors per type at least, this has a different
in-memory representation: two objects (the constructed value and a
tuple which the value references).

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-08 22:50   ` Norman Hardy
  2015-11-09  6:27     ` Florian Weimer
@ 2015-11-09  8:09     ` Soegtrop, Michael
  2015-11-09 10:00       ` Hendrik Boom
  2015-11-09 10:16       ` Alain Frisch
  1 sibling, 2 replies; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-09  8:09 UTC (permalink / raw)
  To: Norman Hardy, Florian Weimer; +Cc: caml-list

Dear Florian, Norman, 

> > Curiously, the argument is not really a tuple.  This does not work:
> >
> > type x = X of int * int
> > let c = (1, 2) in X c
> 
> However the following works:
> # type x  = X of (int * int);;
> type x = X of (int * int)
> # let c = (1, 2) in X c;;
> - : x = X (1, 2)

Exactly this is what is quite confusing (for the beginner): constructors are a rather odd mix of multiple arguments and tuples. The notation looks like tuples, both in definition and use, but it isn't. And it is not a multiple argument function either, since currying doesn't work. That adding parenthesis makes it a real tuple doesn't make it better, since at some other places a*b and (a*b) are the same.

To me this is quite a scar in the beauty of the language - the kind of thing you can't avoid to look at, if you know what I mean. Of cause it is not really an issue. It is just way disappointing for new users to find this kind of imperfection and it gives a little dent in the enthusiasm. But just a little one ;-)

Best regards,

Michael

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09  8:09     ` Soegtrop, Michael
@ 2015-11-09 10:00       ` Hendrik Boom
  2015-11-09 10:16       ` Alain Frisch
  1 sibling, 0 replies; 47+ messages in thread
From: Hendrik Boom @ 2015-11-09 10:00 UTC (permalink / raw)
  To: caml-list

On Mon, Nov 09, 2015 at 08:09:30AM +0000, Soegtrop, Michael wrote:
> Dear Florian, Norman, 
> 
> > > Curiously, the argument is not really a tuple.  This does not work:
> > >
> > > type x = X of int * int
> > > let c = (1, 2) in X c
> > 
> > However the following works:
> > # type x  = X of (int * int);;
> > type x = X of (int * int)
> > # let c = (1, 2) in X c;;
> > - : x = X (1, 2)
> 
> Exactly this is what is quite confusing (for the beginner): constructors are a rather odd mix of multiple arguments and tuples. The notation looks like tuples, both in definition and use, but it isn't. And it is not a multiple argument function either, since currying doesn't work. That adding parenthesis makes it a real tuple doesn't make it better, since at some other places a*b and (a*b) are the same.
> 
> To me this is quite a scar in the beauty of the language - the kind of thing you can't avoid to look at, if you know what I mean. Of cause it is not really an issue. It is just way disappointing for new users to find this kind of imperfection and it gives a little dent in the enthusiasm. But just a little one ;-)

Parentheses should never be used with a meaning other than indicating 
proper grouping, their original function in high school algebra.
OCaml went partway there by abolishing them as syntax for function 
calls.

-- hendrik

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09  8:09     ` Soegtrop, Michael
  2015-11-09 10:00       ` Hendrik Boom
@ 2015-11-09 10:16       ` Alain Frisch
  2015-11-09 10:35         ` Andreas Rossberg
  1 sibling, 1 reply; 47+ messages in thread
From: Alain Frisch @ 2015-11-09 10:16 UTC (permalink / raw)
  To: Soegtrop, Michael, Norman Hardy, Florian Weimer; +Cc: caml-list

On 09/11/2015 09:09, Soegtrop, Michael wrote:
> The notation looks like tuples, both in definition and use, but it isn't.

The should be not big obstacle to allow using real tuples 
(values/patterns) with multi-argument constructors, thus perhaps 
reducing the confusion.  In expression at least, this should be quite 
straightfoward because it can be understood as a local syntactic 
rewriting ("C e" -> "let (x1, ..., xn) = e in C (x1, ..., xn)" when C is 
a constructor with arity > 1 and "e" is not a syntactic tuple).

See:
http://caml.inria.fr/mantis/view.php?id=6455

-- Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 10:16       ` Alain Frisch
@ 2015-11-09 10:35         ` Andreas Rossberg
  2015-11-09 12:28           ` Alain Frisch
  2015-11-09 17:33           ` Alain Frisch
  0 siblings, 2 replies; 47+ messages in thread
From: Andreas Rossberg @ 2015-11-09 10:35 UTC (permalink / raw)
  To: caml-list

On 11/09/2015 11:16 AM, Alain Frisch wrote:
> On 09/11/2015 09:09, Soegtrop, Michael wrote:
>> The notation looks like tuples, both in definition and use, but it isn't.
>
> The should be not big obstacle to allow using real tuples
> (values/patterns) with multi-argument constructors, thus perhaps
> reducing the confusion.  In expression at least, this should be quite
> straightfoward because it can be understood as a local syntactic
> rewriting ("C e" -> "let (x1, ..., xn) = e in C (x1, ..., xn)" when C is
> a constructor with arity > 1 and "e" is not a syntactic tuple).
>
> See:
> http://caml.inria.fr/mantis/view.php?id=6455

Yes please, I would appreciate such sugar. Even more I would appreciate 
generalising that to allowing constructors to be used as first-class 
expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)" 
when C is a constructor with arity > 0). I had to write some AST mapping 
code recently that would have vastly benefited from that.

/Andreas


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 10:35         ` Andreas Rossberg
@ 2015-11-09 12:28           ` Alain Frisch
  2015-11-09 17:33           ` Alain Frisch
  1 sibling, 0 replies; 47+ messages in thread
From: Alain Frisch @ 2015-11-09 12:28 UTC (permalink / raw)
  To: Andreas Rossberg, caml-list

On 09/11/2015 11:35, Andreas Rossberg wrote:
> On 11/09/2015 11:16 AM, Alain Frisch wrote:
>> On 09/11/2015 09:09, Soegtrop, Michael wrote:
>>> The notation looks like tuples, both in definition and use, but it
>>> isn't.
>>
>> The should be not big obstacle to allow using real tuples
>> (values/patterns) with multi-argument constructors, thus perhaps
>> reducing the confusion.  In expression at least, this should be quite
>> straightfoward because it can be understood as a local syntactic
>> rewriting ("C e" -> "let (x1, ..., xn) = e in C (x1, ..., xn)" when C is
>> a constructor with arity > 1 and "e" is not a syntactic tuple).
>>
>> See:
>> http://caml.inria.fr/mantis/view.php?id=6455
>
> Yes please, I would appreciate such sugar.

I've submitted a quick patch that covers expressions only (not patterns) 
on the Mantis ticket.  I'm not very satisfied with the implementation 
technique nor the lack of symmetry with patterns, so I won't propose it 
for inclusion in this form.

-- Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09  6:27     ` Florian Weimer
@ 2015-11-09 13:27       ` Stefan Monnier
  0 siblings, 0 replies; 47+ messages in thread
From: Stefan Monnier @ 2015-11-09 13:27 UTC (permalink / raw)
  To: caml-list

>> However the following works:
>> # type x  = X of (int * int);;
>> type x = X of (int * int)
>> # let c = (1, 2) in X c;;
>> - : x = X (1, 2)

> With multiple constructors per type at least, this has a different
> in-memory representation: two objects (the constructed value and a
> tuple which the value references).

Of course, SML (being the less pragmatic brother) does not have this
"wart" and treats "X of int * int" the same as "X of (int * int)".

But this indeed comes at the cost of a less efficient representation.
You can try to "optimize" this away, but it becomes tricky when you
start using functors where type "t" is a parameter and you have
a constructor "X of t".

IOW, there were good pragmatic reasons to introduce this "wart".
This said I think Haskell shows that using a curried constructor
nicely circumvents the problem (of course it comes at the cost of not
being able to do the equivalent of "X of t", but that doesn't seem to
be much of a problem in practice, especially for Haskell where there
are no functors anyway).


        Stefan


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 10:35         ` Andreas Rossberg
  2015-11-09 12:28           ` Alain Frisch
@ 2015-11-09 17:33           ` Alain Frisch
  2015-11-09 18:08             ` Gabriel Scherer
  1 sibling, 1 reply; 47+ messages in thread
From: Alain Frisch @ 2015-11-09 17:33 UTC (permalink / raw)
  To: Andreas Rossberg, caml-list

On 09/11/2015 11:35, Andreas Rossberg wrote:
> Yes please, I would appreciate such sugar.

I've now submitted a cleaner implementation, working on both expressions 
and patterns:

https://github.com/ocaml/ocaml/pull/284

> Even more I would appreciate
> generalising that to allowing constructors to be used as first-class
> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
> when C is a constructor with arity > 0). I had to write some AST mapping
> code recently that would have vastly benefited from that.

This is not covered (and now, it could simply be "fun x -> C x" :-)).  I 
don't see anything clever to be done on patterns for "unapplied 
constructors", though.


Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 17:33           ` Alain Frisch
@ 2015-11-09 18:08             ` Gabriel Scherer
  2015-11-09 18:16               ` Andreas Rossberg
  2015-11-09 20:32               ` Alain Frisch
  0 siblings, 2 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-09 18:08 UTC (permalink / raw)
  To: Alain Frisch; +Cc: Andreas Rossberg, caml users

If we gave a functional semantic to the unapplied constructor, then I
think that good taste would mandate for the application of this
function and the application of the constructor to be equivalent. This
means that by choosing a tuple-taking function, we commit to the
tuple-application syntax (that nobody likes), and that choosing a
currified function creates an unpleasant inconsistency in the
language.

I don't know whether we could ever manage to transition to a currified
syntax for constructors, but right now it is at least conceivable
because the application syntax is just a concrete syntax choice, it
does not affect typing. Turning unapplied constructor into a function
(tuplified or currified) makes it a typing property, observable at
specification boundaries: we cannot change it.

On Mon, Nov 9, 2015 at 6:33 PM, Alain Frisch <alain.frisch@lexifi.com> wrote:
> On 09/11/2015 11:35, Andreas Rossberg wrote:
>>
>> Yes please, I would appreciate such sugar.
>
>
> I've now submitted a cleaner implementation, working on both expressions and
> patterns:
>
> https://github.com/ocaml/ocaml/pull/284
>
>> Even more I would appreciate
>> generalising that to allowing constructors to be used as first-class
>> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
>> when C is a constructor with arity > 0). I had to write some AST mapping
>> code recently that would have vastly benefited from that.
>
>
> This is not covered (and now, it could simply be "fun x -> C x" :-)).  I
> don't see anything clever to be done on patterns for "unapplied
> constructors", though.
>
>
> Alain
>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 18:08             ` Gabriel Scherer
@ 2015-11-09 18:16               ` Andreas Rossberg
  2015-11-09 21:11                 ` Gabriel Scherer
  2015-11-09 20:32               ` Alain Frisch
  1 sibling, 1 reply; 47+ messages in thread
From: Andreas Rossberg @ 2015-11-09 18:16 UTC (permalink / raw)
  To: Gabriel Scherer, Alain Frisch; +Cc: caml users

On 11/09/2015 07:08 PM, Gabriel Scherer wrote:
> If we gave a functional semantic to the unapplied constructor, then I
> think that good taste would mandate for the application of this
> function and the application of the constructor to be equivalent. This
> means that by choosing a tuple-taking function, we commit to the
> tuple-application syntax (that nobody likes), and that choosing a
> currified function creates an unpleasant inconsistency in the
> language.
>
> I don't know whether we could ever manage to transition to a currified
> syntax for constructors, but right now it is at least conceivable
> because the application syntax is just a concrete syntax choice, it
> does not affect typing. Turning unapplied constructor into a function
> (tuplified or currified) makes it a typing property, observable at
> specification boundaries: we cannot change it.

Hm, I see your point, but don't you already introduce that problem 
(i.e., commit to tuples) by allowing the `C x` sugar for n-ary 
constructors? Because in a world of curried constructors, `x` would not 
be typed as the tuple of arguments, but only as the first argument of 
the constructor.

/Andreas


> On Mon, Nov 9, 2015 at 6:33 PM, Alain Frisch <alain.frisch@lexifi.com> wrote:
>> On 09/11/2015 11:35, Andreas Rossberg wrote:
>>>
>>> Yes please, I would appreciate such sugar.
>>
>>
>> I've now submitted a cleaner implementation, working on both expressions and
>> patterns:
>>
>> https://github.com/ocaml/ocaml/pull/284
>>
>>> Even more I would appreciate
>>> generalising that to allowing constructors to be used as first-class
>>> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
>>> when C is a constructor with arity > 0). I had to write some AST mapping
>>> code recently that would have vastly benefited from that.
>>
>>
>> This is not covered (and now, it could simply be "fun x -> C x" :-)).  I
>> don't see anything clever to be done on patterns for "unapplied
>> constructors", though.
>>
>>
>> Alain
>>
>>
>> --
>> Caml-list mailing list.  Subscription management and archives:
>> https://sympa.inria.fr/sympa/arc/caml-list
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 18:08             ` Gabriel Scherer
  2015-11-09 18:16               ` Andreas Rossberg
@ 2015-11-09 20:32               ` Alain Frisch
  1 sibling, 0 replies; 47+ messages in thread
From: Alain Frisch @ 2015-11-09 20:32 UTC (permalink / raw)
  To: Gabriel Scherer; +Cc: Andreas Rossberg, caml users

On 09/11/2015 19:08, Gabriel Scherer wrote:
> If we gave a functional semantic to the unapplied constructor, then I
> think that good taste would mandate for the application of this
> function and the application of the constructor to be equivalent. This
> means that by choosing a tuple-taking function, we commit to the
> tuple-application syntax (that nobody likes), and that choosing a
> currified function creates an unpleasant inconsistency in the
> language.
>
> I don't know whether we could ever manage to transition to a currified
> syntax for constructors, but right now it is at least conceivable
> because the application syntax is just a concrete syntax choice, it
> does not affect typing. Turning unapplied constructor into a function
> (tuplified or currified) makes it a typing property, observable at
> specification boundaries: we cannot change it.

Making it easier to switch in the distant future to currified 
constructors does not seem a strong argument against improving the 
language now (especially reducing bad surprises for beginners).

The tuple-like syntax is not very much liked, but this is partly caused 
by the fact that arguments cannot be manipulated as real tuples.  With 
the proposed change, this argument goes away.

Moreover, *if* we ever wanted to switch to currified constructors, this 
would not be a purely syntactic rewriting anyway, even with the current 
language.  One would need to have access to constructor declarations to 
drive the rewriting process.  If you one allows oneself to get such 
information out of the type checker, doing the rewriting even in 
presence of the currently suggested changes would be possible as well 
(with extra wrapping/unwrapping).


Alain


>
> On Mon, Nov 9, 2015 at 6:33 PM, Alain Frisch <alain.frisch@lexifi.com> wrote:
>> On 09/11/2015 11:35, Andreas Rossberg wrote:
>>>
>>> Yes please, I would appreciate such sugar.
>>
>>
>> I've now submitted a cleaner implementation, working on both expressions and
>> patterns:
>>
>> https://github.com/ocaml/ocaml/pull/284
>>
>>> Even more I would appreciate
>>> generalising that to allowing constructors to be used as first-class
>>> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
>>> when C is a constructor with arity > 0). I had to write some AST mapping
>>> code recently that would have vastly benefited from that.
>>
>>
>> This is not covered (and now, it could simply be "fun x -> C x" :-)).  I
>> don't see anything clever to be done on patterns for "unapplied
>> constructors", though.
>>
>>
>> Alain
>>
>>
>> --
>> Caml-list mailing list.  Subscription management and archives:
>> https://sympa.inria.fr/sympa/arc/caml-list
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 18:16               ` Andreas Rossberg
@ 2015-11-09 21:11                 ` Gabriel Scherer
  2015-11-09 22:06                   ` Alain Frisch
                                     ` (3 more replies)
  0 siblings, 4 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-09 21:11 UTC (permalink / raw)
  To: Andreas Rossberg; +Cc: Alain Frisch, caml users

On Mon, Nov 9, 2015 at 7:16 PM, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
> Hm, I see your point, but don't you already introduce that problem (i.e.,
> commit to tuples) by allowing the `C x` sugar for n-ary constructors?
> Because in a world of curried constructors, `x` would not be typed as the
> tuple of arguments, but only as the first argument of the constructor.

Yes, it is already problematic, and in fact I'm personally not
completely convinced by this feature -- Alain it "reduces bad
surprises for beginners", but I suspect that adding more magic in this
place could not actually help that much -- at least the current
semantic model is simple.

Another problem with (C x) is the non-trivial performance implications of
  | C x -> x
which actually allocates.

The problem would only get worse if we allowed
  type t = { mutable x : int; mutable y : int }
  type u = Packed of { mutable x : int; mutable y : int }
  let pack x = Packed x
with an observable change in mutability semantics from the same code with
  type u = Packed of t
(but Alain has not suggested adding this feature to decrease surprises
(yet?), and luckily our tuples are immutable.)

I like the revised syntax choice of writing
  type t = A of int and int list
instead of
  type t = A of int * int list
which removes the beginner surprise without introducing other
unpalatable design side-effects. (It is still awkward for GADTs, but
such is life.)

Sometime I think it's wise to avoid local improvements that get stuck
in local maxima.

(This is also my argument against Haskell's choice of using the same
syntax for the pairs (x, y) and the types of pairs (t, u). I guess at
the time they thought that, of course, they would never get type-level
pairs.)

On Mon, Nov 9, 2015 at 7:16 PM, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
> On 11/09/2015 07:08 PM, Gabriel Scherer wrote:
>>
>> If we gave a functional semantic to the unapplied constructor, then I
>> think that good taste would mandate for the application of this
>> function and the application of the constructor to be equivalent. This
>> means that by choosing a tuple-taking function, we commit to the
>> tuple-application syntax (that nobody likes), and that choosing a
>> currified function creates an unpleasant inconsistency in the
>> language.
>>
>> I don't know whether we could ever manage to transition to a currified
>> syntax for constructors, but right now it is at least conceivable
>> because the application syntax is just a concrete syntax choice, it
>> does not affect typing. Turning unapplied constructor into a function
>> (tuplified or currified) makes it a typing property, observable at
>> specification boundaries: we cannot change it.
>
>
> Hm, I see your point, but don't you already introduce that problem (i.e.,
> commit to tuples) by allowing the `C x` sugar for n-ary constructors?
> Because in a world of curried constructors, `x` would not be typed as the
> tuple of arguments, but only as the first argument of the constructor.
>
> /Andreas
>
>
>
>> On Mon, Nov 9, 2015 at 6:33 PM, Alain Frisch <alain.frisch@lexifi.com>
>> wrote:
>>>
>>> On 09/11/2015 11:35, Andreas Rossberg wrote:
>>>>
>>>>
>>>> Yes please, I would appreciate such sugar.
>>>
>>>
>>>
>>> I've now submitted a cleaner implementation, working on both expressions
>>> and
>>> patterns:
>>>
>>> https://github.com/ocaml/ocaml/pull/284
>>>
>>>> Even more I would appreciate
>>>> generalising that to allowing constructors to be used as first-class
>>>> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
>>>> when C is a constructor with arity > 0). I had to write some AST mapping
>>>> code recently that would have vastly benefited from that.
>>>
>>>
>>>
>>> This is not covered (and now, it could simply be "fun x -> C x" :-)).  I
>>> don't see anything clever to be done on patterns for "unapplied
>>> constructors", though.
>>>
>>>
>>> Alain
>>>
>>>
>>> --
>>> Caml-list mailing list.  Subscription management and archives:
>>> https://sympa.inria.fr/sympa/arc/caml-list
>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>
>

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 21:11                 ` Gabriel Scherer
@ 2015-11-09 22:06                   ` Alain Frisch
  2015-11-09 22:27                   ` Andreas Rossberg
                                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 47+ messages in thread
From: Alain Frisch @ 2015-11-09 22:06 UTC (permalink / raw)
  To: Gabriel Scherer, Andreas Rossberg; +Cc: caml users

On 09/11/2015 22:11, Gabriel Scherer wrote:
> Yes, it is already problematic, and in fact I'm personally not
> completely convinced by this feature -- Alain it "reduces bad
> surprises for beginners", but I suspect that adding more magic in this
> place could not actually help that much -- at least the current
> semantic model is simple.

Just to illustrate that the confusion related to n-ary constructors is real:

http://stackoverflow.com/questions/3940345/defining-exceptions-with-tuple-as-argument
http://stackoverflow.com/questions/10306733/ocaml-constructor-unpacking
http://stackoverflow.com/questions/9774671/using-a-variant-type-constructor-with-just-one-tuple-value
http://stackoverflow.com/questions/14818866/int-int-vs-int-int-in-ocaml-sum-type


Now, it's not completely clear that the current proposal is enough to 
reduce significantly the confusion; one could argue that by hiding the 
difference between n-ary constructors and constructors with tuple 
arguments at the value level, one makes it harder for beginners to get 
the right mental model required to understand type inclusion ("type s = 
int * int;; type t = A of s" vs "type t = A of int * int").


-- Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 21:11                 ` Gabriel Scherer
  2015-11-09 22:06                   ` Alain Frisch
@ 2015-11-09 22:27                   ` Andreas Rossberg
  2015-11-09 22:57                     ` Jeremy Yallop
  2015-11-10  0:11                   ` Hendrik Boom
  2015-11-10  8:27                   ` Soegtrop, Michael
  3 siblings, 1 reply; 47+ messages in thread
From: Andreas Rossberg @ 2015-11-09 22:27 UTC (permalink / raw)
  To: Gabriel Scherer; +Cc: Alain Frisch, caml users


> On Nov 9, 2015, at 22:11 , Gabriel Scherer <gabriel.scherer@gmail.com> wrote:
> 
> On Mon, Nov 9, 2015 at 7:16 PM, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
>> Hm, I see your point, but don't you already introduce that problem (i.e.,
>> commit to tuples) by allowing the `C x` sugar for n-ary constructors?
>> Because in a world of curried constructors, `x` would not be typed as the
>> tuple of arguments, but only as the first argument of the constructor.
> 
> Yes, it is already problematic, and in fact I'm personally not
> completely convinced by this feature -- Alain it "reduces bad
> surprises for beginners", but I suspect that adding more magic in this
> place could not actually help that much -- at least the current
> semantic model is simple.
> 
> Another problem with (C x) is the non-trivial performance implications of
>  | C x -> x
> which actually allocates.

That is already the case for some other patterns, e.g. matching float-only records, isn’t it?

> The problem would only get worse if we allowed
>  type t = { mutable x : int; mutable y : int }
>  type u = Packed of { mutable x : int; mutable y : int }
>  let pack x = Packed x
> with an observable change in mutability semantics from the same code with
>  type u = Packed of t
> (but Alain has not suggested adding this feature to decrease surprises
> (yet?), and luckily our tuples are immutable.)

I haven’t yet used the new records in datatypes feature, but I assume the above would involve to distinct nominal types, so there is no reason to assume them compatible.

> I like the revised syntax choice of writing
>  type t = A of int and int list
> instead of
>  type t = A of int * int list
> which removes the beginner surprise without introducing other
> unpalatable design side-effects. (It is still awkward for GADTs, but
> such is life.)

I am not fond of the revised syntax, because it does not explain why the term-level syntax for constructor application uses tuple notation.

It seems to me that tuples are already engrained in the current syntax and semantics. I doubt it will ever be realistically possible to change their meaning. If you want currying, then the backwards-compatible way would be introducing curried constructors as a new form, in addition to tupled ones. They would have a different type, and nothing would be particularly wrong with that! I would sign a petition for such an extension immediately. :)

/Andreas

> Sometime I think it's wise to avoid local improvements that get stuck
> in local maxima.
> 
> (This is also my argument against Haskell's choice of using the same
> syntax for the pairs (x, y) and the types of pairs (t, u). I guess at
> the time they thought that, of course, they would never get type-level
> pairs.)
> 
> On Mon, Nov 9, 2015 at 7:16 PM, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
>> On 11/09/2015 07:08 PM, Gabriel Scherer wrote:
>>> 
>>> If we gave a functional semantic to the unapplied constructor, then I
>>> think that good taste would mandate for the application of this
>>> function and the application of the constructor to be equivalent. This
>>> means that by choosing a tuple-taking function, we commit to the
>>> tuple-application syntax (that nobody likes), and that choosing a
>>> currified function creates an unpleasant inconsistency in the
>>> language.
>>> 
>>> I don't know whether we could ever manage to transition to a currified
>>> syntax for constructors, but right now it is at least conceivable
>>> because the application syntax is just a concrete syntax choice, it
>>> does not affect typing. Turning unapplied constructor into a function
>>> (tuplified or currified) makes it a typing property, observable at
>>> specification boundaries: we cannot change it.
>> 
>> 
>> Hm, I see your point, but don't you already introduce that problem (i.e.,
>> commit to tuples) by allowing the `C x` sugar for n-ary constructors?
>> Because in a world of curried constructors, `x` would not be typed as the
>> tuple of arguments, but only as the first argument of the constructor.
>> 
>> /Andreas
>> 
>> 
>> 
>>> On Mon, Nov 9, 2015 at 6:33 PM, Alain Frisch <alain.frisch@lexifi.com>
>>> wrote:
>>>> 
>>>> On 09/11/2015 11:35, Andreas Rossberg wrote:
>>>>> 
>>>>> 
>>>>> Yes please, I would appreciate such sugar.
>>>> 
>>>> 
>>>> 
>>>> I've now submitted a cleaner implementation, working on both expressions
>>>> and
>>>> patterns:
>>>> 
>>>> https://github.com/ocaml/ocaml/pull/284
>>>> 
>>>>> Even more I would appreciate
>>>>> generalising that to allowing constructors to be used as first-class
>>>>> expressions (i.e., unapplied "C" -> "fun (x1,...,xN) -> C (x1,...,xN)"
>>>>> when C is a constructor with arity > 0). I had to write some AST mapping
>>>>> code recently that would have vastly benefited from that.
>>>> 
>>>> 
>>>> 
>>>> This is not covered (and now, it could simply be "fun x -> C x" :-)).  I
>>>> don't see anything clever to be done on patterns for "unapplied
>>>> constructors", though.
>>>> 
>>>> 
>>>> Alain
>>>> 
>>>> 
>>>> --
>>>> Caml-list mailing list.  Subscription management and archives:
>>>> https://sympa.inria.fr/sympa/arc/caml-list
>>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>> 
>> 
> 
> -- 
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 22:27                   ` Andreas Rossberg
@ 2015-11-09 22:57                     ` Jeremy Yallop
  0 siblings, 0 replies; 47+ messages in thread
From: Jeremy Yallop @ 2015-11-09 22:57 UTC (permalink / raw)
  To: Andreas Rossberg; +Cc: Gabriel Scherer, Alain Frisch, caml users

On 9 November 2015 at 22:27, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
>> On Nov 9, 2015, at 22:11 , Gabriel Scherer <gabriel.scherer@gmail.com> wrote:
>> I like the revised syntax choice of writing
>>  type t = A of int and int list
>> instead of
>>  type t = A of int * int list
>> which removes the beginner surprise without introducing other
>> unpalatable design side-effects. (It is still awkward for GADTs, but
>> such is life.)
>
> I am not fond of the revised syntax, because it does not explain why the term-level syntax for constructor application uses tuple notation.

In fact, the revised syntax doesn't use tuple notation for constructor
application!  The revised type definition syntax also has a few
additional differences, such as prefix type constructor application,
besides the one Gabriel mentioned.  Here's an example, showing how to
define a data type with a multi-argument constructor and to construct
and match against values, with curried notation:

   # type t = [ A of int and list int ];
   type t = [ A of int and list int ]
   # value x = A 3 [];
   value x : t = A 3 []
   # fun [ A x y -> (x, y) ];
   - : t -> (int * list int) = <fun>

However, partial application of constructors is not supported:

   # A 3;
   Characters 0-3:
     A 3;
     ^^^
   Error: The constructor A expects 2 argument(s),
          but is applied here to 1 argument(s)


Jeremy.

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 21:11                 ` Gabriel Scherer
  2015-11-09 22:06                   ` Alain Frisch
  2015-11-09 22:27                   ` Andreas Rossberg
@ 2015-11-10  0:11                   ` Hendrik Boom
  2015-11-10  8:27                   ` Soegtrop, Michael
  3 siblings, 0 replies; 47+ messages in thread
From: Hendrik Boom @ 2015-11-10  0:11 UTC (permalink / raw)
  To: caml-list

On Mon, Nov 09, 2015 at 10:11:30PM +0100, Gabriel Scherer wrote:
> On Mon, Nov 9, 2015 at 7:16 PM, Andreas Rossberg <rossberg@mpi-sws.org> wrote:
> > Hm, I see your point, but don't you already introduce that problem (i.e.,
> > commit to tuples) by allowing the `C x` sugar for n-ary constructors?
> > Because in a world of curried constructors, `x` would not be typed as the
> > tuple of arguments, but only as the first argument of the constructor.
> 
> Yes, it is already problematic, and in fact I'm personally not
> completely convinced by this feature -- Alain it "reduces bad
> surprises for beginners", but I suspect that adding more magic in this
> place could not actually help that much -- at least the current
> semantic model is simple.

If you're looking for a beginner mode that eliminates most surprises, 
the easiest change is to require more explicit type annotations.  Foe 
example, one could require the types of function parameters to be 
explicitly specified.

I find thta this policy makes my code substantially clearer, both to me 
and to the compiler.

--hendrik

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-09 21:11                 ` Gabriel Scherer
                                     ` (2 preceding siblings ...)
  2015-11-10  0:11                   ` Hendrik Boom
@ 2015-11-10  8:27                   ` Soegtrop, Michael
  2015-11-10 10:25                     ` Romain Bardou
  2015-11-10 14:11                     ` Hendrik Boom
  3 siblings, 2 replies; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-10  8:27 UTC (permalink / raw)
  To: caml users

Dear Ocaml Users and Developers,

as a beginner I cannot say much about the rather intricate implications of the various implementation choices. But since a constructor doesn't seem to be a function at all, neither a tuple taking nor a currying one, I would suggest that the constructor declaration syntax makes this clear. e.g. <type a> and <type b> as suggested by Gabriel Scherer. This most likely would avoid some confusion for beginners.

Since both currying and tuple taking constructors can be handy, it would make sense to have "operators", which convert a constructor into a function of the one or the other type. Say if C is a constructor, then C' is a currying function and C" is a tuple taking function. A beginner who comes across this would immediately understand that a constructor is neither a currying nor a tuple taking function, but something else. I guess ' and " wouldn't be possible, but I guess one can find some nice syntax for this. I would prefer to make this conversion explicit rather than an implicit coercion. For beginners it would be a good documentation that there is a difference. As was pointed out in the mail thread, the difference can be hidden to a certain extent, but at some point it would show up and the confusion would be even greater.

The question if the application of a constructor shall follow the tuple or the normal function call style is, as far as I can tell, a purely syntactic choice. Here I would definitely prefer the (C x y) syntax over the C (x, y) simply because I think it is more natural to put the () around an entity rather than at a place where the head symbol gets separated from the arguments. Maybe it be possible to have C of int*int with C (1,2) syntax and C of int and int with (C 1 2) syntax at the same time and promote the latter syntax in tutorials or even give a deprecation warning, but I guess these would then have to be different at the type level.

Another note: it was suggested in this mail thread to enforce type specifications for function arguments to make the life of beginners easier. I would rather not do this. A functional language lives from function arguments and in many cases it is clear what it is and being forced to write this down would be just a nuisance. I enjoy the flexibility to give the types only at interface functions and to leave it away in internal functions where it is clear. People coming from C++, where functional style programming is turned done a lot by the heavy syntax required to write down what you want, will definitely enjoy this. What might help to make the life of beginners easier is to have a compiler option to print the types of all defined functions. I think many people don't start with ocamltop, but with the compiler. In my case I started a project where I thought it is likely easier to learn Ocaml and to write it in Ocaml than to write it in C++. Such projects you don't start with ocamltop. But for high reliability code, it would make sense to have a compiler option to enforce full type specifications of all arguments.

Many thanks for the very interesting and educating discussion!

Best regards,

Michael

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10  8:27                   ` Soegtrop, Michael
@ 2015-11-10 10:25                     ` Romain Bardou
  2015-11-10 10:44                       ` Alain Frisch
  2015-11-10 14:11                     ` Hendrik Boom
  1 sibling, 1 reply; 47+ messages in thread
From: Romain Bardou @ 2015-11-10 10:25 UTC (permalink / raw)
  To: caml-list

Hello,

In the Mantis thread I proposed that #C or (C) would be the curried 
version of constructor C. I think #C is nice and does not create any 
parsing issue, as constructors are capitalized and if I'm not mistaken 
method names cannot be. And even if they can, # is in a prefix position 
here, it should not create any conflict. (C) was inspired by the syntax 
for symbols like (+), but I like it much less (too many parentheses, one 
extra keystroke, parentheses should just be used for grouping…).

Let's assume that C has arity 2 and we write "C x". I think it would be 
rather confusing if it was not partial application but, instead, x was 
expected to be a pair. On the other hand, "C (x, y)" does look like C is 
an uncurried function. So I don't see any solution that is not confusing 
one way or another, unless we introduce new syntax such as #C.

As a side-note, another wish I have is that one day I'm able to write 
something like #f where f is a field name, to convert it to a getter, 
i.e. (fun x -> x.f). It raises the question of setters as well: ##f to 
get (fun r x -> r.f <- x) or (fun r x -> { r with f = x }). Or, #f is a 
(get, set) pair and we have #?f for the getter only and #!f for the 
setter only. What I'm saying is that if new syntax for constructors is 
added, it would be nice if it were also usable for fields later. This is 
another reason why (C) is bad, as (f) for fields definitely does not work.

I have often had to write (fun x -> C x) by hand, as well as (fun x -> 
x.f), (fun r -> r.f) and (fun r x -> { r with f = x }). In the 
constructor example, quite often C is Some.

I do not often feel the need to write (fun C x -> x) however, except if 
C has arity 2. With arity 1 it already works, and with arity 3 or more I 
usually use a record to name my fields. This may change now that we have 
inline records.

--------- (the rest is off-topic) -----------

By the way, aren't you annoyed to have to write:

   { r with f = { r.f with g = { r.f.g with h = x } } }

especially when field names are long? In one of my programs, I have defined:

   type ('r, 'a) field = { get: 'r -> 'a; set: 'r -> 'a -> 'r }

   let (<.>) f g =
     {
       get = (fun r -> g.get (f.get r));
       set = (fun r x -> f.set r (g.set (f.get r) x));
     }

If #f was a new syntax which built the field record above, we could write:

   (#f <.> #g <.> #h).set r x

Instead of the nested { with ... } above. Of course it would be better 
to just be able to write { r with f.g.h = x } in the first place :)

Cheers,

-- Romain

On 10/11/2015 09:27, Soegtrop, Michael wrote:
> Dear Ocaml Users and Developers,
>
> as a beginner I cannot say much about the rather intricate implications of the various implementation choices. But since a constructor doesn't seem to be a function at all, neither a tuple taking nor a currying one, I would suggest that the constructor declaration syntax makes this clear. e.g. <type a> and <type b> as suggested by Gabriel Scherer. This most likely would avoid some confusion for beginners.
>
> Since both currying and tuple taking constructors can be handy, it would make sense to have "operators", which convert a constructor into a function of the one or the other type. Say if C is a constructor, then C' is a currying function and C" is a tuple taking function. A beginner who comes across this would immediately understand that a constructor is neither a currying nor a tuple taking function, but something else. I guess ' and " wouldn't be possible, but I guess one can find some nice syntax for this. I would prefer to make this conversion explicit rather than an implicit coercion. For beginners it would be a good documentation that there is a difference. As was pointed out in the mail thread, the difference can be hidden to a certain extent, but at some point it would show up and the confusion would be even greater.
>
> The question if the application of a constructor shall follow the tuple or the normal function call style is, as far as I can tell, a purely syntactic choice. Here I would definitely prefer the (C x y) syntax over the C (x, y) simply because I think it is more natural to put the () around an entity rather than at a place where the head symbol gets separated from the arguments. Maybe it be possible to have C of int*int with C (1,2) syntax and C of int and int with (C 1 2) syntax at the same time and promote the latter syntax in tutorials or even give a deprecation warning, but I guess these would then have to be different at the type level.
>
> Another note: it was suggested in this mail thread to enforce type specifications for function arguments to make the life of beginners easier. I would rather not do this. A functional language lives from function arguments and in many cases it is clear what it is and being forced to write this down would be just a nuisance. I enjoy the flexibility to give the types only at interface functions and to leave it away in internal functions where it is clear. People coming from C++, where functional style programming is turned done a lot by the heavy syntax required to write down what you want, will definitely enjoy this. What might help to make the life of beginners easier is to have a compiler option to print the types of all defined functions. I think many people don't start with ocamltop, but with the compiler. In my case I started a project where I thought it is likely easier to learn Ocaml and to write it in Ocaml than to write it in C++. Such projects you don't start with ocamltop
 .
 But for high reliability code, it would make sense to have a compiler option to enforce full type specifications of all arguments.
>
> Many thanks for the very interesting and educating discussion!
>
> Best regards,
>
> Michael
>
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
>


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 10:25                     ` Romain Bardou
@ 2015-11-10 10:44                       ` Alain Frisch
  2015-11-10 10:55                         ` Romain Bardou
  2015-11-10 11:17                         ` Soegtrop, Michael
  0 siblings, 2 replies; 47+ messages in thread
From: Alain Frisch @ 2015-11-10 10:44 UTC (permalink / raw)
  To: Romain Bardou, caml-list

On 10/11/2015 11:25, Romain Bardou wrote:
> In the Mantis thread I proposed that #C or (C) would be the curried
> version of constructor C.

If we go in the direction of making n-ary constructors behave as 
constructor taking a tuple (at the expression level) then it seems 
confusing that #C would mean something different for:

   type t = A of int * int

and for:

   type t = A of (int * int)

Moreover, I'm not sure about the benefit:  how often do you need to 
partially apply a constructor?  And it's easy to define manually the 
helper function (let a x y = A (x, y)) if needed.  I don't think adding 
dedicated syntax is justified here.

Andreas suggested that a non-constant unapplied constructor would be 
interpreted as a function (i.e. just A would be interpreted as (fun x -> 
A x)).  This would allow writing for instance "List.map Some l", and 
have the nice consequence that "Some e" becomes equivalent to "(Some) 
e".  The only drawback I can think of with this idea is less useful 
error locations when changing a constant constructor into a non-constant 
one.

Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 10:44                       ` Alain Frisch
@ 2015-11-10 10:55                         ` Romain Bardou
  2015-11-10 13:17                           ` Alain Frisch
  2015-11-13 15:36                           ` Romain Bardou
  2015-11-10 11:17                         ` Soegtrop, Michael
  1 sibling, 2 replies; 47+ messages in thread
From: Romain Bardou @ 2015-11-10 10:55 UTC (permalink / raw)
  To: Alain Frisch, caml-list

On 10/11/2015 11:44, Alain Frisch wrote:
> On 10/11/2015 11:25, Romain Bardou wrote:
>> In the Mantis thread I proposed that #C or (C) would be the curried
>> version of constructor C.
>
> If we go in the direction of making n-ary constructors behave as
> constructor taking a tuple (at the expression level) then it seems
> confusing that #C would mean something different for:
>
>    type t = A of int * int
>
> and for:
>
>    type t = A of (int * int)
>
> Moreover, I'm not sure about the benefit:  how often do you need to
> partially apply a constructor?  And it's easy to define manually the
> helper function (let a x y = A (x, y)) if needed.  I don't think adding
> dedicated syntax is justified here.
>
> Andreas suggested that a non-constant unapplied constructor would be
> interpreted as a function (i.e. just A would be interpreted as (fun x ->
> A x)).  This would allow writing for instance "List.map Some l", and
> have the nice consequence that "Some e" becomes equivalent to "(Some)
> e".  The only drawback I can think of with this idea is less useful
> error locations when changing a constant constructor into a non-constant
> one.
>
> Alain
>

That #C would mean something different for the definitions is an issue 
with the syntax and the semantics of constructor definitions I believe, 
which is already rather confusing :)

That being said it's true that most of the time when I use a constructor 
as a function, the constructor has arity 1. In fact, most of the time it 
is Some.

Cheers,

-- 
Romain Bardou

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 10:44                       ` Alain Frisch
  2015-11-10 10:55                         ` Romain Bardou
@ 2015-11-10 11:17                         ` Soegtrop, Michael
  1 sibling, 0 replies; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-10 11:17 UTC (permalink / raw)
  To: Alain Frisch, Romain Bardou, caml-list

Dear Alain,

> Moreover, I'm not sure about the benefit:  how often do you need to
> partially apply a constructor?  And it's easy to define manually the helper
> function (let a x y = A (x, y)) if needed.  I don't think adding dedicated syntax
> is justified here.

I see the main benefit of an explicit syntax for "constructor term" vs "currying constructor function" vs "tuple constructor function" in making it obvious that there is such a distinction.

I would agree with Romain, that for record fields a "functionify" operator would be of more practical use and also that it would also make sense to use the same "functionify" operator for different constructs which are not functions but have some obvious conversion into functions.

Best regards,

Michael
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 10:55                         ` Romain Bardou
@ 2015-11-10 13:17                           ` Alain Frisch
  2015-11-10 13:41                             ` Romain Bardou
  2015-11-13 15:36                           ` Romain Bardou
  1 sibling, 1 reply; 47+ messages in thread
From: Alain Frisch @ 2015-11-10 13:17 UTC (permalink / raw)
  To: Romain Bardou, caml-list

On 10/11/2015 11:55, Romain Bardou wrote:
> That #C would mean something different for the definitions is an issue
> with the syntax and the semantics of constructor definitions I believe,
> which is already rather confusing :)

This confusion is precisely the one I'm trying to address with GPR#284. 
  At the expression and pattern level, things are pretty clear: 
constructors take 0 or 1 argument.  The only subtlety that remains is 
with the type inclusion relation, but this is not at the expression 
level.  Let's not re-introduce more confusion by making it observable 
again at the expression level whether the constructor was defined as "A 
of (int * int)" or "A of int * int".


Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 13:17                           ` Alain Frisch
@ 2015-11-10 13:41                             ` Romain Bardou
  2015-11-10 14:01                               ` Alain Frisch
  0 siblings, 1 reply; 47+ messages in thread
From: Romain Bardou @ 2015-11-10 13:41 UTC (permalink / raw)
  To: Alain Frisch, caml-list

On 10/11/2015 14:17, Alain Frisch wrote:
> On 10/11/2015 11:55, Romain Bardou wrote:
>> That #C would mean something different for the definitions is an issue
>> with the syntax and the semantics of constructor definitions I believe,
>> which is already rather confusing :)
>
> This confusion is precisely the one I'm trying to address with GPR#284.
>   At the expression and pattern level, things are pretty clear:
> constructors take 0 or 1 argument.  The only subtlety that remains is
> with the type inclusion relation, but this is not at the expression
> level.  Let's not re-introduce more confusion by making it observable
> again at the expression level whether the constructor was defined as "A
> of (int * int)" or "A of int * int".

I see: you do not just propose to have a way to extract a tuple from a 
multi-argument constructor. What you propose is to make all constructors 
have only 0 or 1 argument (which may be a tuple). Under the hood, the 
tuple case is flattened to avoid an allocation, but the programmer does 
not have to know anymore (unless he uses Obj I guess).

That would be a great change I believe.

-- 
Romain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 13:41                             ` Romain Bardou
@ 2015-11-10 14:01                               ` Alain Frisch
  0 siblings, 0 replies; 47+ messages in thread
From: Alain Frisch @ 2015-11-10 14:01 UTC (permalink / raw)
  To: Romain Bardou, caml-list

On 10/11/2015 14:41, Romain Bardou wrote:
> I see: you do not just propose to have a way to extract a tuple from a
> multi-argument constructor. What you propose is to make all constructors
> have only 0 or 1 argument (which may be a tuple).

That's what already happen at the syntactic level.  I'm not proposing to 
change that, nor the interpretation of type declarations.  The change is 
how constructor expressions and patterns are type-checked (and 
compiled), in order to make transparent at these levels whether the 
constructor was defined as taking a tuple or several arguments.


> Under the hood, the
> tuple case is flattened to avoid an allocation, but the programmer does
> not have to know anymore (unless he uses Obj I guess).

He still needs to know, since:

  module X : sig    type t = A of int * int end
           = struct type t = A of (int * int) end

would still fail.


Alain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10  8:27                   ` Soegtrop, Michael
  2015-11-10 10:25                     ` Romain Bardou
@ 2015-11-10 14:11                     ` Hendrik Boom
  2015-11-10 14:40                       ` immanuel litzroth
  2015-11-10 15:30                       ` Soegtrop, Michael
  1 sibling, 2 replies; 47+ messages in thread
From: Hendrik Boom @ 2015-11-10 14:11 UTC (permalink / raw)
  To: caml-list

On Tue, Nov 10, 2015 at 08:27:52AM +0000, Soegtrop, Michael wrote:
> Dear Ocaml Users and Developers,
...
...
> 
> Another note: it was suggested in this mail thread to enforce type 
> specifications for function arguments to make the life of beginners 
> easier. I would rather not do this. A functional language lives from 
> function arguments and in many cases it is clear what it is and being 
> forced to write this down would be just a nuisance. I enjoy the 
> flexibility to give the types only at interface functions and to leave 
> it away in internal functions where it is clear. People coming from 
> C++, where functional style programming is turned done a lot by the 
> heavy syntax required to write down what you want, will definitely 
> enjoy this.

Please, the problem with C++ for functional programming isn't that you 
have to specify the types of functions; it's that the syntax of types in 
C++ is completely inside-out and insane.  I've been programming in C 
since the 70's and I *still* find it confusing.  OCaml type notation, 
like Algol 68 type notation, is a breath of fresh air by comparison.

And of course, that C++ doesn't have first-class functions.  Or has that 
changed recently?

> What might help to make the life of beginners easier is to 
> have a compiler option to print the types of all defined functions. I 
> think many people don't start with ocamltop, but with the compiler. In 
> my case I started a project where I thought it is likely easier to 
> learn Ocaml and to write it in Ocaml than to write it in C++. Such 
> projects you don't start with ocamltop. But for high reliability code, 
> it would make sense to have a compiler option to enforce full type 
> specifications of all arguments.

In any case, the problem with OCaml's apparent typelessness isn't that 
you don't have to write the types, it's that when you see someone  
else's code you can't read the types.

--- hendr9ik

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 14:11                     ` Hendrik Boom
@ 2015-11-10 14:40                       ` immanuel litzroth
  2015-11-10 15:30                       ` Soegtrop, Michael
  1 sibling, 0 replies; 47+ messages in thread
From: immanuel litzroth @ 2015-11-10 14:40 UTC (permalink / raw)
  To: Hendrik Boom; +Cc: OCaML List Mailing

[-- Attachment #1: Type: text/plain, Size: 2711 bytes --]

1) Recent c++ has several syntaxes for specifying types of functions, see
e.g:
http://en.cppreference.com/w/cpp/utility/functional/function

2) C++ has the equivalent of first class functions.

One of the main problems of  functional programming in C++ is that it
doesn't really
support composition of algorithms very well. This guy explains it very well:
https://www.youtube.com/watch?v=BFnhhPehpKw
Greetz,
i


On Tue, Nov 10, 2015 at 3:11 PM, Hendrik Boom <hendrik@topoi.pooq.com>
wrote:

> On Tue, Nov 10, 2015 at 08:27:52AM +0000, Soegtrop, Michael wrote:
> > Dear Ocaml Users and Developers,
> ...
> ...
> >
> > Another note: it was suggested in this mail thread to enforce type
> > specifications for function arguments to make the life of beginners
> > easier. I would rather not do this. A functional language lives from
> > function arguments and in many cases it is clear what it is and being
> > forced to write this down would be just a nuisance. I enjoy the
> > flexibility to give the types only at interface functions and to leave
> > it away in internal functions where it is clear. People coming from
> > C++, where functional style programming is turned done a lot by the
> > heavy syntax required to write down what you want, will definitely
> > enjoy this.
>
> Please, the problem with C++ for functional programming isn't that you
> have to specify the types of functions; it's that the syntax of types in
> C++ is completely inside-out and insane.  I've been programming in C
> since the 70's and I *still* find it confusing.  OCaml type notation,
> like Algol 68 type notation, is a breath of fresh air by comparison.
>
> And of course, that C++ doesn't have first-class functions.  Or has that
> changed recently?
>
> > What might help to make the life of beginners easier is to
> > have a compiler option to print the types of all defined functions. I
> > think many people don't start with ocamltop, but with the compiler. In
> > my case I started a project where I thought it is likely easier to
> > learn Ocaml and to write it in Ocaml than to write it in C++. Such
> > projects you don't start with ocamltop. But for high reliability code,
> > it would make sense to have a compiler option to enforce full type
> > specifications of all arguments.
>
> In any case, the problem with OCaml's apparent typelessness isn't that
> you don't have to write the types, it's that when you see someone
> else's code you can't read the types.
>
> --- hendr9ik
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 3840 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* RE: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 14:11                     ` Hendrik Boom
  2015-11-10 14:40                       ` immanuel litzroth
@ 2015-11-10 15:30                       ` Soegtrop, Michael
  2015-11-10 17:27                         ` Gerd Stolpmann
  1 sibling, 1 reply; 47+ messages in thread
From: Soegtrop, Michael @ 2015-11-10 15:30 UTC (permalink / raw)
  To: Hendrik Boom, caml-list

Dear Hendrik,

> And of course, that C++ doesn't have first-class functions.  Or has that
> changed recently?

C++11 claims to be a functional language and supports anonymous functions and currying. But as you say: the syntax of types, especially function types, is rather messy in C/C++.

> In any case, the problem with OCaml's apparent typelessness isn't that you
> don't have to write the types, it's that when you see someone else's code
> you can't read the types.

I don't know how others handle this. I came to the conclusion that it might be a good compromise to write explicit types on interface functions and omit them on internal functions. But as newbie I can't tell how readable this is to others or to me in 5 years.

Best regards,

Michael
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Christian Lamprechter
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928


^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 15:30                       ` Soegtrop, Michael
@ 2015-11-10 17:27                         ` Gerd Stolpmann
  0 siblings, 0 replies; 47+ messages in thread
From: Gerd Stolpmann @ 2015-11-10 17:27 UTC (permalink / raw)
  To: Soegtrop, Michael; +Cc: Hendrik Boom, caml-list

[-- Attachment #1: Type: text/plain, Size: 1919 bytes --]

Am Dienstag, den 10.11.2015, 15:30 +0000 schrieb Soegtrop, Michael:
> Dear Hendrik,
> 
> > And of course, that C++ doesn't have first-class functions.  Or has that
> > changed recently?
> 
> C++11 claims to be a functional language

Hmmm, a language whose name is an assignment...

>  and supports anonymous functions and currying.

That's only a small part of the story. I think more important is how
much control a language gives you about side effects, and AFAIK C++
doesn't let you control much, and common programming practice goes into
the opposite direction (e.g. think of stateful iterators).

Gerd

>  But as you say: the syntax of types, especially function types, is rather messy in C/C++.
> 
> > In any case, the problem with OCaml's apparent typelessness isn't that you
> > don't have to write the types, it's that when you see someone else's code
> > you can't read the types.
> 
> I don't know how others handle this. I came to the conclusion that it might be a good compromise to write explicit types on interface functions and omit them on internal functions. But as newbie I can't tell how readable this is to others or to me in 5 years.
> 
> Best regards,
> 
> Michael
> Intel Deutschland GmbH
> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
> Tel: +49 89 99 8853-0, www.intel.de
> Managing Directors: Christin Eisenschmid, Christian Lamprechter
> Chairperson of the Supervisory Board: Nicole Lau
> Registered Office: Munich
> Commercial Register: Amtsgericht Muenchen HRB 186928
> 
> 

-- 
------------------------------------------------------------
Gerd Stolpmann, Darmstadt, Germany    gerd@gerd-stolpmann.de
My OCaml site:          http://www.camlcity.org
Contact details:        http://www.camlcity.org/contact.html
Company homepage:       http://www.gerd-stolpmann.de
------------------------------------------------------------

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Newbie comment on constructor syntax
  2015-11-10 10:55                         ` Romain Bardou
  2015-11-10 13:17                           ` Alain Frisch
@ 2015-11-13 15:36                           ` Romain Bardou
  1 sibling, 0 replies; 47+ messages in thread
From: Romain Bardou @ 2015-11-13 15:36 UTC (permalink / raw)
  To: Alain Frisch, caml-list

> That being said it's true that most of the time when I use a constructor
> as a function, the constructor has arity 1. In fact, most of the time it
> is Some.

For the record, I'm writing code right now which contains a rather 
common example with arity 2: binary operators in an AST.

type ast =
   | Plus of t * t
   | ...

let add_list l =
   match l with
     | [] -> ...
     | hd :: tl -> List.fold_left (fun a b -> Plus (a, b)) hd tl

It's not partially applied but it does need to be curried. I'm not 
saying that it justifies a new syntax in itself :)

-- 
Romain

^ permalink raw reply	[flat|nested] 47+ messages in thread

* [Caml-list] Notation for currying
  2015-11-06 12:34     ` Gabriel Scherer
  2015-11-06 13:09       ` Soegtrop, Michael
@ 2015-11-21 17:24       ` Hendrik Boom
  2015-11-21 17:41         ` Gabriel Scherer
  2015-11-21 18:05         ` David Rajchenbach-Teller
  1 sibling, 2 replies; 47+ messages in thread
From: Hendrik Boom @ 2015-11-21 17:24 UTC (permalink / raw)
  To: caml-list

On Fri, Nov 06, 2015 at 01:34:11PM +0100, Gabriel Scherer wrote:
> 
> I personally believe that currified constructor syntax would be a better
> choice, and that using non-currified constructors is a historical mistake
> of SML/Caml. But I am also not convinced that efforts to change it today
> are worth the trouble, and prefer to concentrate on improving other parts
> of the OCaml ecosystem.

Perhaps there should be explicit syntax for currying, such as
   f a b _
instead of 
   f a b
That would permit currying in other argument positions:
   f a _ c
though I suspect _ may be the wrong symbol for the current language, and 
I also suspect it's far too late tointroduce it in the current language.

I have noticed that almost a the situations where the compiler thinks I 
mean to curry I actually just left out a parameter by mistake.  The type 
inferences it makes based on these errors usually occur elsewhere and 
are truly mystifying.

-- hendrik

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Notation for currying
  2015-11-21 17:24       ` [Caml-list] Notation for currying Hendrik Boom
@ 2015-11-21 17:41         ` Gabriel Scherer
  2015-11-21 18:05         ` David Rajchenbach-Teller
  1 sibling, 0 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-21 17:41 UTC (permalink / raw)
  To: Hendrik Boom; +Cc: caml users

[-- Attachment #1: Type: text/plain, Size: 2526 bytes --]

In a previous life I would write Camlp4 extension for fun, and I used the
syntax
  \( ... _ ...)
to abstract over an anonymous variables (you could also use \1 \2 \3 etc,
and the n-th occurence of _ from left to right was turned into \n, but
mixing numbers and _ was disallowed). It solves Scala's problem that, the
scope of _ being delimited by the closest parentheses, the notation was not
composable -- but arguably enforcing a small scope is a good thing.

This is the kind of features that nobody will ever agree on, so it's too
hard to get them in a language. Nowadays I write "(fun x ->" instead of
"\(", and "x" instead of "_", and it is not that bad.

Arthur Charguéraud has been working on an "easy-type-errors" mode with
better typing error messages for OCaml. You may be interested in his article
  http://www.chargueraud.org/research/2015/ocaml_errors/ocaml_errors.pdf
although I think this specific case of under-application is not discussed
(using too many argument is discussed).

I also find the work on SHErrLoc, by Danfeng Zhang, Andrew C. Myers and
their collaborators, to be very impressive:
  http://www.cs.cornell.edu/Projects/SHErrLoc/

On Sat, Nov 21, 2015 at 6:24 PM, Hendrik Boom <hendrik@topoi.pooq.com>
wrote:

> On Fri, Nov 06, 2015 at 01:34:11PM +0100, Gabriel Scherer wrote:
> >
> > I personally believe that currified constructor syntax would be a better
> > choice, and that using non-currified constructors is a historical mistake
> > of SML/Caml. But I am also not convinced that efforts to change it today
> > are worth the trouble, and prefer to concentrate on improving other parts
> > of the OCaml ecosystem.
>
> Perhaps there should be explicit syntax for currying, such as
>    f a b _
> instead of
>    f a b
> That would permit currying in other argument positions:
>    f a _ c
> though I suspect _ may be the wrong symbol for the current language, and
> I also suspect it's far too late tointroduce it in the current language.
>
> I have noticed that almost a the situations where the compiler thinks I
> mean to curry I actually just left out a parameter by mistake.  The type
> inferences it makes based on these errors usually occur elsewhere and
> are truly mystifying.
>
> -- hendrik
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 3512 bytes --]

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Notation for currying
  2015-11-21 17:24       ` [Caml-list] Notation for currying Hendrik Boom
  2015-11-21 17:41         ` Gabriel Scherer
@ 2015-11-21 18:05         ` David Rajchenbach-Teller
  2015-11-21 18:55           ` Gabriel Scherer
  1 sibling, 1 reply; 47+ messages in thread
From: David Rajchenbach-Teller @ 2015-11-21 18:05 UTC (permalink / raw)
  To: Hendrik Boom, caml-list

As a side question, is currying really an important language feature? In
my experience, it hinders readability and makes it harder to reason
about types ("wait, is it weakly or strongly polymorphic? exactly which
type variables were generalized?")

After coding a number of years in languages without currying, I haven't
found myself lacking this feature a single time.

Cheers,
 David

On 21/11/15 18:24, Hendrik Boom wrote:
> On Fri, Nov 06, 2015 at 01:34:11PM +0100, Gabriel Scherer wrote:
>>
>> I personally believe that currified constructor syntax would be a better
>> choice, and that using non-currified constructors is a historical mistake
>> of SML/Caml. But I am also not convinced that efforts to change it today
>> are worth the trouble, and prefer to concentrate on improving other parts
>> of the OCaml ecosystem.
> 
> Perhaps there should be explicit syntax for currying, such as
>    f a b _
> instead of 
>    f a b
> That would permit currying in other argument positions:
>    f a _ c
> though I suspect _ may be the wrong symbol for the current language, and 
> I also suspect it's far too late tointroduce it in the current language.
> 
> I have noticed that almost a the situations where the compiler thinks I 
> mean to curry I actually just left out a parameter by mistake.  The type 
> inferences it makes based on these errors usually occur elsewhere and 
> are truly mystifying.
> 
> -- hendrik
> 

^ permalink raw reply	[flat|nested] 47+ messages in thread

* Re: [Caml-list] Notation for currying
  2015-11-21 18:05         ` David Rajchenbach-Teller
@ 2015-11-21 18:55           ` Gabriel Scherer
  0 siblings, 0 replies; 47+ messages in thread
From: Gabriel Scherer @ 2015-11-21 18:55 UTC (permalink / raw)
  To: David.Teller; +Cc: Hendrik Boom, caml users

The initial discussion was more about the difference in readability
between two syntaxes for fully-applied functions or constructors,
  f(x, y, z), C(x, y, z)
or
  f x y z, C x y z
I find the latter more readable in many settings, in particular where
functions or constructors are nested. One typical example would be the
"balance" functions for Okasaki-inspired red-black trees, for example
https://www.lri.fr/~filliatr/ftp/ocaml/ds/rbset.ml.html

Compare
    | Red (Red (a,x,b), y, c), z, d ->
        Red (Black (a,x,b), y, Black (c,z,d))
with
    | (Red (Red a x b) y c), z, d
        Red (Black a x b) y (Black c z d)

Note that using this syntax does not in itself require supporting
partial application, even though they are naturally linked in the most
common reading of this syntax as nested unary application.

Now, to your question of "do we need to make it easy to partially
abstract over the last parameter of the function", I think I would
agree with you that this is not essential (especially when the syntax
for abstraction is already lightweight). However, having a good syntax
for application is a rather subtle balance to strike that may require
cooperation of several distinct syntactic elements -- in particular
when you also want to support named parameters (or have a lightweight
enough syntax for records or named tuples that looks like named
parameters). I like named parameters as they often improve the
robustness of APIs -- lightweight records are even better because they
can be both passed and returned.

Finally, in Mezzo ( http://protz.github.io/mezzo/ ) there is a cute
trick that I have not seen anywhere else, and I wonder whether it is
an extraordinary (but ancedotal) coincidence or something that should
be reused. The syntax for function parameters in function prototypes
(declarations, signature items)

   val concat: [a] (consumes list a, consumes list a) -> (list a)

and in function definitions

  val concat [a] (consumes xs: list a, consumes ys: list a): list a =
    ...

is exactly the same.

(See http://protz.github.io/mezzo/tutorial/tutorial.html.pp.html#function-types
, http://protz.github.io/mezzo/tutorial/tutorial.html.pp.html#function-definitions
)

This is only possible because the language has just enough dependent
types to make it natural to name all function parameters in their
types, and even do deep pattern-matching on an argument directly from
the type definition. It reminds us of the strange identification
between types and patterns in CDuce ( http://www.cduce.org/ ).

On Sat, Nov 21, 2015 at 7:05 PM, David Rajchenbach-Teller
<David.Teller@ens-lyon.org> wrote:
> As a side question, is currying really an important language feature? In
> my experience, it hinders readability and makes it harder to reason
> about types ("wait, is it weakly or strongly polymorphic? exactly which
> type variables were generalized?")
>
> After coding a number of years in languages without currying, I haven't
> found myself lacking this feature a single time.
>
> Cheers,
>  David
>
> On 21/11/15 18:24, Hendrik Boom wrote:
>> On Fri, Nov 06, 2015 at 01:34:11PM +0100, Gabriel Scherer wrote:
>>>
>>> I personally believe that currified constructor syntax would be a better
>>> choice, and that using non-currified constructors is a historical mistake
>>> of SML/Caml. But I am also not convinced that efforts to change it today
>>> are worth the trouble, and prefer to concentrate on improving other parts
>>> of the OCaml ecosystem.
>>
>> Perhaps there should be explicit syntax for currying, such as
>>    f a b _
>> instead of
>>    f a b
>> That would permit currying in other argument positions:
>>    f a _ c
>> though I suspect _ may be the wrong symbol for the current language, and
>> I also suspect it's far too late tointroduce it in the current language.
>>
>> I have noticed that almost a the situations where the compiler thinks I
>> mean to curry I actually just left out a parameter by mistake.  The type
>> inferences it makes based on these errors usually occur elsewhere and
>> are truly mystifying.
>>
>> -- hendrik
>>
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2015-11-21 18:56 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-06  9:33 [Caml-list] Newbie comment on constructor syntax Soegtrop, Michael
2015-11-06 10:04 ` Nicolas Ojeda Bar
2015-11-06 10:31 ` Francois Berenger
2015-11-06 12:20   ` Soegtrop, Michael
2015-11-06 12:34     ` Gabriel Scherer
2015-11-06 13:09       ` Soegtrop, Michael
2015-11-06 14:10         ` Ashish Agarwal
2015-11-06 15:19           ` Soegtrop, Michael
2015-11-06 15:21             ` Ashish Agarwal
2015-11-21 17:24       ` [Caml-list] Notation for currying Hendrik Boom
2015-11-21 17:41         ` Gabriel Scherer
2015-11-21 18:05         ` David Rajchenbach-Teller
2015-11-21 18:55           ` Gabriel Scherer
2015-11-06 12:29 ` [Caml-list] Newbie comment on constructor syntax Jonas Jensen
2015-11-06 12:46   ` Soegtrop, Michael
2015-11-06 12:54     ` Gabriel Scherer
2015-11-08 21:16 ` Florian Weimer
2015-11-08 22:50   ` Norman Hardy
2015-11-09  6:27     ` Florian Weimer
2015-11-09 13:27       ` Stefan Monnier
2015-11-09  8:09     ` Soegtrop, Michael
2015-11-09 10:00       ` Hendrik Boom
2015-11-09 10:16       ` Alain Frisch
2015-11-09 10:35         ` Andreas Rossberg
2015-11-09 12:28           ` Alain Frisch
2015-11-09 17:33           ` Alain Frisch
2015-11-09 18:08             ` Gabriel Scherer
2015-11-09 18:16               ` Andreas Rossberg
2015-11-09 21:11                 ` Gabriel Scherer
2015-11-09 22:06                   ` Alain Frisch
2015-11-09 22:27                   ` Andreas Rossberg
2015-11-09 22:57                     ` Jeremy Yallop
2015-11-10  0:11                   ` Hendrik Boom
2015-11-10  8:27                   ` Soegtrop, Michael
2015-11-10 10:25                     ` Romain Bardou
2015-11-10 10:44                       ` Alain Frisch
2015-11-10 10:55                         ` Romain Bardou
2015-11-10 13:17                           ` Alain Frisch
2015-11-10 13:41                             ` Romain Bardou
2015-11-10 14:01                               ` Alain Frisch
2015-11-13 15:36                           ` Romain Bardou
2015-11-10 11:17                         ` Soegtrop, Michael
2015-11-10 14:11                     ` Hendrik Boom
2015-11-10 14:40                       ` immanuel litzroth
2015-11-10 15:30                       ` Soegtrop, Michael
2015-11-10 17:27                         ` Gerd Stolpmann
2015-11-09 20:32               ` Alain Frisch

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).