Почему flatten объявлен в GenericTraversableTemplate, а не в TraversableLike?

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