Domanda

La firma di TraversableLike.flatMap è la seguente:

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

La firma di GenericTraversableTemplate.flatten è:

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

Perché il secondo metodo (che mi sembra differire da flatMap solo nel senso che la funzione del trasformatore è implicit) non è definibile su TraversableLike come:

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

C'è qualche motivo per cui questo deve essere il caso?

È stato utile?

Soluzione

Penso che la risposta risieda nel codice sorgente:

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

Il parametro implicito su flatten dovrebbe effettivamente essere A <:< Traversable[B] (vale a dire un'asserzione che il parametro generico di GenericTraversableTemplate è esso stesso Traversable). (Vedi questa discussione sulla mailing list per una discussione sul motivo per cui è attualmente commentato.) La mia comprensione è che tutti i metodi in questo tratto erano definiti su (alcuni) degli oggetti associati delle classi di raccolta perché erano applicabili solo per alcune istanze (se questo è la parola giusta) dei parametri di tipo. Questo <:< costrutto consente di creare metodi di istanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top