Как работает шаблон соответствия класса case?

Я только что видел этот класс case в пакете Scala actors:

case class ! [a](ch: Channel[a], msg: a)

И в JavaDoc он описывает использование в следующей форме:

receive {
  case Chan1 ! msg1 => ...
  case Chan2 ! msg2 => ...
}

Почему это не так:

receive {
  case !(Chan1, msg1) => ...
  case !(Chan2, msg2) => ...
}

Является оператором bang! специальный случай аналогично методам, заканчивающимся в двоеточие:

Ответ 1

При выполнении сопоставления шаблонов компилятор Scala будет интерпретировать o1 c1 o2 так же, как c1(o1, o2). Вот почему :: работает внутри шаблонов.