Ты уже на полпути. Это возможно, потому что Scala позволяет вам делать это для всех типов, которые были объявлены с двумя параметрами типа.
Например:
scala> case class Foo[X,Y]()
defined class Foo
scala> val x: Int Foo Double = Foo[Int,Double]()
x: Foo[Int,Double] = Foo()
Поначалу это может показаться странным, но на самом деле это действительно хорошее свойство, так как этот синтаксис может сделать вещи более читабельными. Рассмотрим следующий пример, в котором определен пользовательский тип для кортежа:
class |::|[A, B](val left: A, val right: B)
object |::| {
def unapply[A, B](o: A |::| B) = Some((o.left, o.right))
}
Здесь A |::| B
используется как инфиксная запись для |::|[A, B]
. С другой стороны, scala также позволяет использовать инфиксную нотацию для сопоставления с образцом (спасибо incrop за напоминание), как в случае конструктора в следующем примере:
new |::|("Hello","World") match {
case l |::| r => Console println (l + "," + r)
case _ =>
}