caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Syntax for several matches, each with a "when" clause, but only one result
@ 2016-05-20  7:57 Soegtrop, Michael
  2016-05-20  8:37 ` Mr. Herr
  0 siblings, 1 reply; 5+ messages in thread
From: Soegtrop, Michael @ 2016-05-20  7:57 UTC (permalink / raw)
  To: caml-list

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

Dear OCaml Users,

sometimes I want to do something like

match expr with
| case1 when cond1
| case2 when cond2
| case3 when cond3 -> result

but this doesn't work. I have to write

match expr with
| case1 when cond1 -> result
| case2 when cond2 -> result
| case3 when cond3 -> result

Usually only some of the matches have a when clause. Is there a way to avoid copying the result term (other than writing a function) ?

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: 3220 bytes --]

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

* Re: [Caml-list] Syntax for several matches, each with a "when" clause, but only one result
  2016-05-20  7:57 [Caml-list] Syntax for several matches, each with a "when" clause, but only one result Soegtrop, Michael
@ 2016-05-20  8:37 ` Mr. Herr
  2016-05-20 10:04   ` Soegtrop, Michael
  0 siblings, 1 reply; 5+ messages in thread
From: Mr. Herr @ 2016-05-20  8:37 UTC (permalink / raw)
  To: caml-list

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



On 20.05.2016 09:57, Soegtrop, Michael wrote:
>
> Dear OCaml Users,
>
>  
>
> sometimes I want to do something like
>
>  
>
> match expr with
>
> | case1 when cond1
>
> | case2 when cond2
>
> | case3 when cond3 -> result
>
>  
>
> but this doesn’t work. I have to write
>
>  
>
> match expr with
>
> | case1 when cond1 -> result
>
> | case2 when cond2 -> result
>
> | case3 when cond3 -> result
>
>  
>
> Usually only some of the matches have a when clause. Is there a way to avoid
> copying the result term (other than writing a function) ?
>
>  
>
>
I could not see a working web link to this old list message from 2016-04-07, so I
just give you a copy of the answer by
Gabriel Scherer:

No, indeed you have to use a local definition to avoid code
duplication in this case.

My understanding of the design stance of pattern-matching in OCaml is
as follows: the syntax of patterns is bounded by what can be matched
efficiently. This explains why "when" has a second-class status
(first-class when cannot be matched efficiently); sometimes the user
has to pay for this rigidity. But, on the positive side, it is a
simple and clear stance, and it correlates with the availability of
good tooling, namely exhaustivity and useless-clause warnings.

On Thu, Apr 7, 2016 at 9:36 AM, Daniel Bünzli
<daniel.buenzli@erratique.ch> wrote:

> Hello,
>
> Something I run quite often is the following pattern matching
>
> match v with
> | None | Some c when sat c -> expr
> | Some …
>
> which doesn't compile and forces me to write
>
> match v with
> | None -> expr
> | Some c when sat c -> expr
> | Some …
>
> and leads to code duplication or the introduction of a definition to avoid it.
>
> Am I missing a syntax bit ?
>
> Best,
>
> Daniel


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

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

* RE: [Caml-list] Syntax for several matches, each with a "when" clause, but only one result
  2016-05-20  8:37 ` Mr. Herr
@ 2016-05-20 10:04   ` Soegtrop, Michael
  2016-05-20 10:23     ` Mr. Herr
  0 siblings, 1 reply; 5+ messages in thread
From: Soegtrop, Michael @ 2016-05-20 10:04 UTC (permalink / raw)
  To: Mr. Herr, caml-list

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

Thanks a lot for pointing me to this answer! Obviously I need to work on my search skills …

Best regards,

Michael

From: caml-list-request@inria.fr [mailto:caml-list-request@inria.fr] On Behalf Of Mr. Herr
Sent: Friday, May 20, 2016 10:38 AM
To: caml-list@inria.fr
Subject: Re: [Caml-list] Syntax for several matches, each with a "when" clause, but only one result


On 20.05.2016 09:57, Soegtrop, Michael wrote:
Dear OCaml Users,

sometimes I want to do something like

match expr with
| case1 when cond1
| case2 when cond2
| case3 when cond3 -> result

but this doesn’t work. I have to write

match expr with
| case1 when cond1 -> result
| case2 when cond2 -> result
| case3 when cond3 -> result

Usually only some of the matches have a when clause. Is there a way to avoid copying the result term (other than writing a function) ?


I could not see a working web link to this old list message from 2016-04-07, so I just give you a copy of the answer by
Gabriel Scherer:



No, indeed you have to use a local definition to avoid code

duplication in this case.



My understanding of the design stance of pattern-matching in OCaml is

as follows: the syntax of patterns is bounded by what can be matched

efficiently. This explains why "when" has a second-class status

(first-class when cannot be matched efficiently); sometimes the user

has to pay for this rigidity. But, on the positive side, it is a

simple and clear stance, and it correlates with the availability of

good tooling, namely exhaustivity and useless-clause warnings.



On Thu, Apr 7, 2016 at 9:36 AM, Daniel Bünzli

<daniel.buenzli@erratique.ch><mailto:daniel.buenzli@erratique.ch> wrote:

Hello,



Something I run quite often is the following pattern matching



match v with

| None | Some c when sat c -> expr

| Some …



which doesn't compile and forces me to write



match v with

| None -> expr

| Some c when sat c -> expr

| Some …



and leads to code duplication or the introduction of a definition to avoid it.



Am I missing a syntax bit ?



Best,



Daniel

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: 8656 bytes --]

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

* Re: [Caml-list] Syntax for several matches, each with a "when" clause, but only one result
  2016-05-20 10:04   ` Soegtrop, Michael
@ 2016-05-20 10:23     ` Mr. Herr
  2016-05-23 15:35       ` Christophe Raffalli
  0 siblings, 1 reply; 5+ messages in thread
From: Mr. Herr @ 2016-05-20 10:23 UTC (permalink / raw)
  To: caml-list

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

hmm, difficult to find. The title was "Suboptimal pattern specification", but I just knew
this problem was discussed here or on SO within the last ?? days.

/Str.

On 20.05.2016 12:04, Soegtrop, Michael wrote:
>
> Thanks a lot for pointing me to this answer! Obviously I need to work on my search
> skills …
>
>  
>
> Best regards,
>
>  
>
> Michael
>
>  
>
> *From:*caml-list-request@inria.fr [mailto:caml-list-request@inria.fr] *On Behalf Of
> *Mr. Herr
> *Sent:* Friday, May 20, 2016 10:38 AM
> *To:* caml-list@inria.fr
> *Subject:* Re: [Caml-list] Syntax for several matches, each with a "when" clause,
> but only one result
>
>  
>
>  
>
> On 20.05.2016 09:57, Soegtrop, Michael wrote:
>
>     Dear OCaml Users,
>
>      
>
>     sometimes I want to do something like
>
>      
>
>     match expr with
>
>     | case1 when cond1
>
>     | case2 when cond2
>
>     | case3 when cond3 -> result
>
>      
>
>     but this doesn’t work. I have to write
>
>      
>
>     match expr with
>
>     | case1 when cond1 -> result
>
>     | case2 when cond2 -> result
>
>     | case3 when cond3 -> result
>
>      
>
>     Usually only some of the matches have a when clause. Is there a way to avoid
>     copying the result term (other than writing a function) ?
>
>      
>
>      
>
> I could not see a working web link to this old list message from 2016-04-07, so I
> just give you a copy of the answer by
> Gabriel Scherer:
>
>
> No, indeed you have to use a local definition to avoid code
> duplication in this case.
>  
> My understanding of the design stance of pattern-matching in OCaml is
> as follows: the syntax of patterns is bounded by what can be matched
> efficiently. This explains why "when" has a second-class status
> (first-class when cannot be matched efficiently); sometimes the user
> has to pay for this rigidity. But, on the positive side, it is a
> simple and clear stance, and it correlates with the availability of
> good tooling, namely exhaustivity and useless-clause warnings.
>  
> On Thu, Apr 7, 2016 at 9:36 AM, Daniel Bünzli
> <daniel.buenzli@erratique.ch> <mailto:daniel.buenzli@erratique.ch> wrote:
>
>     Hello,
>
>      
>
>     Something I run quite often is the following pattern matching
>
>      
>
>     match v with
>
>     | None | Some c when sat c -> expr
>
>     | Some …
>
>      
>
>     which doesn't compile and forces me to write
>
>      
>
>     match v with
>
>     | None -> expr
>
>     | Some c when sat c -> expr
>
>     | Some …
>
>      
>
>     and leads to code duplication or the introduction of a definition to avoid it.
>
>      
>
>     Am I missing a syntax bit ?
>
>      
>
>     Best,
>
>      
>
>     Daniel
>
>  
>
> 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: 10392 bytes --]

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

* Re: [Caml-list] Syntax for several matches, each with a "when" clause, but only one result
  2016-05-20 10:23     ` Mr. Herr
@ 2016-05-23 15:35       ` Christophe Raffalli
  0 siblings, 0 replies; 5+ messages in thread
From: Christophe Raffalli @ 2016-05-23 15:35 UTC (permalink / raw)
  To: Mr. Herr; +Cc: caml-list

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


Hello,

personnaly, I am not happy with the semantics of when guarded clause (and If I remember well
already mentionned it on the list):

match (1,2) with
  (x,y) | (y,x) when y <= x -> (x,y)
| _ -> assert false

will raise an assert false ... while being quite elegant ...

I think "when" should be distributive on "or pattern", which would imply that "when" should be allowed deep in patterns.

It certainly makes pattern compilation harder, but it should not really change the completeness of pattern analysis
because guarded clause are more or less ignored ?

Cheers,
Christoĥe

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

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

end of thread, other threads:[~2016-05-23 15:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-20  7:57 [Caml-list] Syntax for several matches, each with a "when" clause, but only one result Soegtrop, Michael
2016-05-20  8:37 ` Mr. Herr
2016-05-20 10:04   ` Soegtrop, Michael
2016-05-20 10:23     ` Mr. Herr
2016-05-23 15:35       ` Christophe Raffalli

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