Scala, в Predef
, определяет поддержку для ->
и →
(здесь немного очищено):
final class ArrowAssoc[A](val __leftOfArrow: A) extends AnyVal {
def -> [B](y: B): Tuple2[A, B] = Tuple2(__leftOfArrow, y)
def →[B](y: B): Tuple2[A, B] = ->(y)
}
Это удобно для создания пар с использованием нотации стрелки вместо синтаксиса простого кортежа:
scala> "foo" → 42
res0: (String, Int) = (foo,42)
Этот синтаксис стрелки можно легко расширить с помощью определения типа и экстрактора (здесь отображается только →
):
type →[A, B] = (A, B)
object → { def unapply[A, B](t: (A, B)) = Some(t) }
Это позволяет писать такие вещи, как:
"a" → 42 match { case a → b ⇒ println(s"found `$a` and `$b`") }
и
def foo[A, B](t: A → B) = ???
Мне интересно, если какая-либо причина Scala не определяет их также в стандартной библиотеке. Есть ли недостатки этих определений?