Perché l'appiattimento è dichiarato su GenericTraversableTemplate e non su TraversableLike?
-
05-07-2019 - |
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?
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.