tatuajes parejas para nombres enamoradas scala

scala - nombres - tatuajes para parejas



Extendiendo la notaciĆ³n de flecha de Scala para parejas (2)

Scala, en Predef , define el soporte para -> y (aquí limpiado un poco):

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) }

Esto le permite convenientemente crear pares usando una notación de flecha en lugar de la sintaxis de la tupla simple:

scala> "foo" → 42 res0: (String, Int) = (foo,42)

Esta sintaxis de flecha se puede ampliar fácilmente con una definición de tipo y un extractor (aquí solo se muestra ):

type →[A, B] = (A, B) object → { def unapply[A, B](t: (A, B)) = Some(t) }

Esto te permite escribir cosas como:

"a" → 42 match { case a → b ⇒ println(s"found `$a` and `$b`") }

y:

def foo[A, B](t: A → B) = ???

Me pregunto si hay alguna razón por la que Scala no los defina también en su biblioteca estándar. ¿Hay alguna desventaja a estas definiciones?


Aquí hay un inconveniente. Poder hacer ambas cosas

def foo[A, B](t: A -> B) = ???

y

def foo[A, B](t: A => B) = ???

sería confuso Si los tipos no se alinean, el compilador lo atrapará, por supuesto. Sin embargo, solo un programador experimentado de Scala entendería el mensaje de error rápidamente.


Estoy bastante seguro de que -> solo existe para tener una forma fácil de leer para inicializar las entradas del Map . No pretende ser una forma de propósito general para representar pares. Debe usar la sintaxis (a, b) para todos los demás usos para evitar confusiones. Tal como está, ya hay dos formas diferentes de representar un par ( (a, b) y Tuple2(a, b) ). No necesitamos un tercero.

Podría argumentar que querría que un -> extractor haga una coincidencia de patrones en las entradas del Map para aclarar qué parte es la clave y cuál es el valor, pero recuerde que el case (key, value) hace que la distinción sea igual de clara. Es solo en el caso de la inicialización que no hay una manera clara de distinguir qué parte es la clave y cuál es el valor, aparte de usar -> .