* [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