Pergunta

A assinatura do TraversableLike.flatMap é o seguinte:

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

A assinatura do GenericTraversableTemplate.flatten é:

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

Por que é o último método (que me parece diferir flatMap apenas no sentido de que a função do transformador é implicit) não definível em TraversableLike como:

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

Existe alguma razão que este deve ser o caso?

Foi útil?

Solução

Eu acho que as mentiras resposta no código fonte:

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

O parâmetro implícito para flatten deve realmente ser A <:< Traversable[B] (isto é. Uma afirmação de que o parâmetro genérico de GenericTraversableTemplate é em si Traversable). (Veja esta discussão lista de discussão para a discussão sobre por que ele está atualmente comentada.) o meu entendimento é que todos os métodos neste traço costumava ser definida em (alguns) o companheiro objetos de classes de coleção porque eram aplicáveis ??apenas para algumas instâncias (se isso é a palavra certa) de parâmetros de tipo. Esta construção <:< permite que sejam feitos os métodos de instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top