2012-02-25 13 views
63

he encontrado el siguiente fragmento de código:¿Para qué sirve la palabra clave forSome en Scala?

List[T] forSome { type T } 

El forSome se parece a un método, pero mi amigo me dijo que es una palabra clave.

Lo busqué en Google, pero encontré algunos documentos acerca de forSome. ¿Qué significa y dónde puedo obtener algunos documentos al respecto?

Respuesta

43

La palabra clave forSome se utiliza para definir tipos existenciales en Scala. Esta es la página de Scala glossary que explica cuáles son. No pude encontrar un lugar en los documentos de Scala explicando en detalle, así que here es un artículo de blog que encontré en Google explicando cómo son útiles.

Actualización: puede encontrar una definición precisa de tipos existenciales en el Scala specification pero es bastante densa.

Para resumir algunas de las publicaciones a las que me he vinculado, los tipos existenciales son útiles cuando quiere operar en algo pero no le importan los detalles del tipo. Por ejemplo, usted quiere operar sobre matrices, pero no le importa qué tipo de matriz:

def printFirst(x : Array[T] forSome {type T}) = println(x(0)) 

que también se podría hacer con una variable de tipo del método:

def printFirst[T](x : Array[T]) = println(x(0)) 

pero Puede que no desee agregar la variable de tipo en algunos casos. También puede agregar un salto a la variable de tipo:

def addToFirst(x : Array[T] forSome {type T <: Integer}) = x(0) + 1 

Véase también this blog post que es donde conseguí este ejemplo de.

+0

@JanekBogucki El enlace de arriba no funciona. – jpcooper

+0

http://www.scala-lang.org/news/roadmap-next.html - "se eliminó alguna sintaxis". –

+0

forSome está programado para su eliminación en el lanzamiento de "Don Giovanni": https://www.scala-lang.org/news/roadmap-next.html –

3

No sé Scala, pero su pregunta despertó mi interés y comenzó a buscar en Google.

I encontrado que en Scala's changelog:.

"Ahora es posible definir tipos existenciales usando la nueva palabra clave forSome Un tipo existencial tiene la forma T forSome {Q} donde Q es una secuencia de valor y/o tipo declaraciones. "

+5

Alguna información se puede encontrar también en [Scala Spec] (http://www.scala-lang.org/docu/files/ScalaReference.pdf), en la página 26 –

+1

especificación actual: http: //www.scala -lang.org/files/archive/spec/2.11/03-types.html#existential-types –