2013-05-04 16 views
7

パターンマッチング構造をチェーン化できないのはなぜですか?例えば、以下は、パターン一致 "return"の値

val a = ADT(5) 

val b = a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} 
b match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

無意味な場合、法的ですが、以下ではありません。

a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
} match { 
    case ADT(a) if a > 13 => doSomething(a) 
    case _ => {} 
} 

は私が最初の場所でそれをやってはならないからだと疑うが、原則的になぜそれが合法でないのかわかりません。

+4

'(マッチ{..})マッチ{..}'動作します。 – user2246674

答えて

5

はい、Scalaの(ほぼ)すべてが式であり、すべての式をパターンマッチとして使用できるため、うまくいくはずです。

この場合、パターンマッチは式なので、別の「連鎖」パターンマッチで使用できます。しかし、コンパイラはそれを好まない。コンパイラに括弧で少しヒントを与える

ができます:

case class ADT(value: Int) 

val a = ADT(5) 

(a match { 
    case ADT(a) if a > 4 => ADT(a * 3) 
    case ADT(a) => ADT(a + 1) 
}) match { 
    case ADT(a) if a > 13 => println(a) 
    case _ => {} 
} 
+0

私は括弧の回避策も見つけましたが、ここで必要な理由は分かりませんが、 'val a = if(false)6 else if(true)if(true)5 else 3 else 2' –

+0

@CarlSummersコンパイラはあまり推論できません。それは操作の順序です。疑わしいとき(あなた、またはコンパイラ)明示的になる。 (私は実際にScalaを初めて使ったことがありますが、これは私が愛していることの1つです)。 – hangtwenty

3

あなたの直感は正しいです。 —通常はのように埋め込み演算子を連結することができます(他のユーザーが示唆しているように)。実際、matchはメソッド—として実装されていましたが、代わりの構文が有効になるように中置演算子(デフォルトで左結合)—として機能しました。しかし、Scala 2.5では、matchがメソッドの代わりに特別な言語構造になっていました。残念ながら、私はそれがなぜ行われたのかわかりませんが、それは理由です:matchではありませんそうだと思われます。

関連する問題