6

I have a case class

case class ~[a,b](_1:a, _2:b)

When I want to do pattetn matching

new ~("a", 25) match{
  case "a" ~ 25 =>
}

I can use it this way because "a" ~ 25 and ~("a", 25) are equivalent. But if I want to match new ~("a", new ~("b", 25)) by {case "a" ~ "b" ~ 25 => } troubles begin. I understand that this statements aren't equivalent. So, how new ~("a", new ~("b", 25)) can be presented? By what rules?

4

1 に答える 1

10

これは機能します:

new ~("a", new ~("b", 25)) match {
  case "a" ~ ("b" ~ 25) =>
}

したがって、最初の句と同じように括弧を配置する必要があります。それ以外の場合、チルダは左結合であるため、パターンのタイプが異なり、コンパイルされません。

case "a" ~ "b" ~ 25

と同じです

case ("a" ~ "b") ~ 25

あなたの場合、これは間違っているでしょう。

付録

クラス/メソッド名の最後の文字としてコロンを使用することで、右結合性を得ることができます。以下は、括弧なしでコンパイルおよび一致します(newコンパイラが混乱することはもうないので、を削除できます$tilde$colon)。

case class ~:[a,b](_1:a, _2:b)

~:("a", ~:("b", 25)) match {
  case "a" ~: "b" ~: 25 =>
}

反応

1)newキーワードがない場合、引数のビット単位の否定を与えるcase class ~によってシャドウイングされます。unary_~likeの式~ 2は内部で評価されunary_~(2)、の場合も同じ~ ("a", 1)です。ただしunary_~、そのタプルで定義しない限り、エラーが発生します。newキーワードを使用して、その名前のクラスを明示的に探すようにコンパイラーにアドバイスします。これにより、混乱することはありません。$tilde("a", 1)(技術的には、の内部名であるwhichを使用してこれを回避できますcase class ~が、これはコンパイラの詳細であるため、おそらくこれに依存しないでください。)

2&3)右結合性は、Scala言語仕様で参照されています。セクション「中置操作」</p>

演算子の結合性は、演算子の最後の文字によって決まります。コロン「:」で終わる演算子は右結合です。他のすべての演算子は左結合です。

ちなみに、右結合性は、を使用してリストを作成できるようにするためのトリックですNil。(Nilは空Listであり、右結合連結演算子が::定義されています。)

val l: List[Int] = 1 :: 2 :: 3 :: Nil

これは次のように評価されます

val l: List[Int] = (1 :: (2 :: (3 :: Nil)))

または、より正確には、3 :: Nil≡なのでNil.::(3)

val l: List[Int] = ( ( Nil.::(3) ).::(2) ).::(1)
于 2010-07-14T12:46:03.697 に答える