> On 6 Apr 2019, at 21:17, Remi Forax <fo...@univ-mlv.fr> wrote:
> 
> Currently this code doesn't compile
>  IntConsumer c = x -> switch(x) { default -> System.out.println(x); };
> 
> I believe it should because this is the basic pattern for supporting the 
> actor model,
> you consume a message and do a side effect* depending on the type of the 
> message,
> translated in Java, you want a lambda that takes a message as parameter, 
> calls a switch to do the pattern matching and return void.

I understand, although this is actually to do with the way lambda expressions 
are typed, rather than the switch expression. In JLS 15.27.3 "Type of a Lambda 
Expression”, there is a special case:

        • If the function type's result is void, the lambda body is either a 
statement expression (§14.8) or a void-compatible block.

Which means that the following code typechecks:

IntConsumer ic = x -> System.out.println(x);

but it breaks as soon as we nest the statement expression, e.g.

IntConsumer ic2 = x -> true ? System.out.println(x) : System.out.println(x); // 
Compilation error: target-type for conditional expression cannot be void
This is what is happening in your example. So to deal with this we’d either 
have to make typechecking of lambdas smarter - either by replacing the typing 
rule for lambdas above with something more compositional, or by making void a 
first-class type, or we could perhaps add a pattern-matching form of lambda, 
which has a void-aware typing rule. I’m not sure about any of these options for 
now.

Cheers,
Gavin


Reply via email to