Scalaで二項演算子を行頭に置く

Scalaでは、Javaでいうところの文末のセミコロンを省略できて便利ですが、それと引き換えに失ったものがあります。

というと、おおげさですが、単に↓みたいに、二項演算子(この場合、|)を行頭にそろえて書けないということです。

lazy val statement: Parser[Statement] = ifStatement | forStatement | whileStatement

これは何故かというと、行末のセミコロンを省略できるせいで、最初のifStatementの後の改行で式が終わったと判断されてしまい、その次の| forStatementでコンパイルエラーになってしまうからです。

これが問題になるかというと、それほど問題ではないのですが、不便だと感じる場面は時折あります。たとえば、パーザコンビネータを使うときは、読みやすさのために上のように書きたいのですが、それができません。

さて、この問題ですが、二項演算子によってつなげたい一連の式を()で囲むだけ、という実に簡単な方法で対処することができます。たとえば、パーザコンビネータの例だと次のようになります。

lazy val statement: Parser[Statement] = ( ifStatement | forStatement | whileStatement )