TraversableLikeではなくGenericTraversableTemplateでflattenが宣言されているのはなぜですか?

StackOverflow https://stackoverflow.com/questions/1802828

質問

TraversableLike.flatMapの署名は次のとおりです。

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

GenericTraversableTemplate.flattenの署名は次のとおりです。

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

なぜ後者の方法なのか(これは、トランス関数がflatMapであるという意味でのみimplicitと異なるように思えます)TraversableLikeで次のように定義できません:

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

これが事実でなければならない理由はありますか?

役に立ちましたか?

解決

答えはソースコードにあると思います:

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

flattenへの暗黙的なパラメーターは、実際にはA <:< Traversable[B]である必要があります(つまり、GenericTraversableTemplateの汎用パラメーター自体がTraversableであるという主張)。 (このメーリングリストスレッドを参照してください現在コメントアウトされている理由についての議論。)私の理解では、この特性のすべてのメソッドはコレクションクラスのコンパニオンオブジェクト(の一部)で定義されていました。型パラメータの正しい単語)。この<:<構造により、インスタンスメソッドにすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top