Frage

Die Unterzeichnung TraversableLike.flatMap ist wie folgt:

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

Die Unterzeichnung GenericTraversableTemplate.flatten ist:

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

Warum ist die letztere Methode (die ich scheint von flatMap nur in dem Sinne zu unterscheiden, dass der Transformator Funktion implicit ist) nicht definierbar auf TraversableLike wie:

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

Gibt es einen Grund, dass dies der Fall sein muss?

War es hilfreich?

Lösung

Ich glaube, die Antwort liegt im Quelltext:

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

Der implizite Parameter sollte auf flatten tatsächlich A <:< Traversable[B] (dh. Eine Behauptung, dass der generische Parameter von GenericTraversableTemplate selbst Traversable). (Siehe dieser Mailing-List-Thread für die Diskussion darüber, warum es zur Zeit ist als Kommentar gekennzeichnet.) Mein Verständnis ist, dass alle Verfahren in dieser Eigenschaft verwendet, auf (einige) der Begleiter Gegenstände der Sammlung Klassen definiert werden, da sie für einige instantiations nur anwendbar waren (wenn das das richtige Wort) des Typparameters. Dieses <:< Konstrukt ermöglicht es ihnen Methoden hergestellt Instanz werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top