Match Expressions

The syntactical precedence of match expressions has been changed. match is still a keyword, but it is used like an alphabetical operator. This has several consequences:

  1. match expressions can be chained:

    xs match {
      case Nil => "empty"
      case _   => "nonempty"
    } match {
      case "empty"    => 0
      case "nonempty" => 1
    }
    

    (or, dropping the optional braces)

    xs match
      case Nil => "empty"
      case _   => "nonempty"
    match
      case "empty" => 0
      case "nonempty" => 1
    
  2. match may follow a period:

    if xs.match
      case Nil => false
      case _   => true
    then "nonempty"
    else "empty"
    
  3. The scrutinee of a match expression must be an InfixExpr. Previously the scrutinee could be followed by a type ascription : T, but this is no longer supported. So x : T match { ... } now has to be written (x: T) match { ... }.

Syntax

The new syntax of match expressions is as follows.

InfixExpr    ::=  ...
               |  InfixExpr MatchClause
SimpleExpr   ::=  ...
               |  SimpleExpr ‘.’ MatchClause
MatchClause  ::=  ‘match’ ‘{’ CaseClauses ‘}’