Pregunta

La firma de TraversableLike.flatMap es la siguiente:

def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th

La firma de GenericTraversableTemplate.flatten es:

def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B] 

¿Por qué el último método (que me parece diferente de flatMap solo en el sentido de que la función del transformador es implicit) no se puede definir en TraversableLike como:

def flatten[B, Th](implicit asTraversable: (A) => Traversable[B], 
                   implicit bf : CanBuildFrom[Repr, B, Th]) : Th

¿Hay alguna razón para que este sea el caso?

¿Fue útil?

Solución

Creo que la respuesta está en el código fuente:

def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]

El parámetro implícito para flatten en realidad debería ser A <:< Traversable[B] (es decir, una afirmación de que el parámetro genérico de GenericTraversableTemplate es en sí Traversable). (Consulte este hilo de la lista de correo para discutir sobre por qué está actualmente comentado.) Entiendo que todos los métodos en este rasgo solían definirse en (algunos) los objetos complementarios de las clases de colección porque solo eran aplicables para algunas instancias (si eso es la palabra correcta) de los parámetros de tipo. Esta construcción <:< les permite hacerse métodos de instancia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top