Chaining match expressions does not compile.
val x = Array("abc", "pqr")
x match {
case Array("abc", _*) => Some("abc is first")
case Array("xyz", _*) => Some("xyz is first")
case _ => None
} match {
case Some(x) => x
case _ => "Either empty or incorrect first entry"
}
While the following compiles fine:
(x match {
case Array("abc", _*) => Some("abc is first")
case Array("xyz", _*) => Some("xyz is first")
case _ => None
}) match {
case Some(x) => x
case _ => "Either empty or incorrect first entry"
}
Why does the later version (where first match expression is in paranthesis) compile fine while earlier one does not?
If it were allowed, you couldn't do:
scala> List(1,2,3) last match { case 3 => true }
warning: there were 1 feature warning(s); re-run with -feature for details
res6: Boolean = true
That is, if it were infix notation, then the thing to the left could not be postfix.
Disallowing infix match permits a postfix scrutinee.
That expression is parsed the natural way
(List(1,2,3) last) match { case 3 => true }
that is, if postfix notation is natural and not unholy.
The feature warning is for import language.postfixOps. Perhaps with that feature turned off, the Defenders of the Good would be willing to entertain import language.infixMatch.
Consider constructs that are syntactic siblings to match, that are not infixable without parens:
scala> if (true) 1 else 2 match { case 1 => false }
res4: AnyVal = 1 // not false
scala> (if (true) 1 else 2) match { case 1 => false }
res1: Boolean = false
or
scala> throw new IllegalStateException match { case e => "ok" }
<console>:11: error: type mismatch; // not "ok", or rather, Nothing
found : String("ok")
required: Throwable
throw new IllegalStateException match { case e => "ok" }
^
scala> (throw new IllegalStateException) match { case e => "ok" }
java.lang.IllegalStateException
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With