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