Почему flatten объявлен в GenericTraversableTemplate, а не в TraversableLike? - PullRequest
2 голосов
/ 26 ноября 2009

Подпись 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

Есть ли какая-то причина, по которой это должно быть так?

1 Ответ

2 голосов
/ 12 апреля 2010

Я думаю, что ответ лежит в исходном коде:

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

Неявный параметр для flatten должен фактически быть A <:< Traversable[B] (т. Е. Утверждение, что универсальный параметр GenericTraversableTemplate сам по себе Traversable). (См. эту ветку списка рассылки для обсуждения того, почему она в настоящее время закомментирована.) Насколько я понимаю, все методы этой черты раньше определялись (некоторые из) сопутствующих объектов классов коллекции, потому что они были применимо только для некоторых экземпляров (если это правильное слово) параметров типа. Эта конструкция <:< позволяет им создавать методы экземпляра.

...