Какой экземпляр CanBuildFrom обнаруживает компилятор Scala? - PullRequest
7 голосов
/ 28 ноября 2011

каждый.Пожалуйста, прости меня за глупый вопрос о Скале.Хотя я программирую в Scala около 2 лет, мне все еще трудно понять, что такое implicit.Давайте рассмотрим пример для обсуждения:

Array(1,2,3,4).map(x => x) 

Если вы посмотрите скалярный документ, вы не сможете найти метод map в классе Array.Причина, по которой map может применяться к Array(1,2,3,4), заключается в том, что в scala.Predef определена неявная функция implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int].

Однако существует два списка параметров, где второй записывается как implicit bf: CanBuildFrom[Array[T], B, That]).Теперь мне интересно, где компилятор находит правильный аргумент для типа CanBuildFrom при применении map к Array(1,2,3,4).

Ответы [ 2 ]

9 голосов
/ 28 ноября 2011

Неявное разрешение включает в себя поиск объекта-компаньона для типа неявного параметра , а также объектов-компаньонов для параметров типа неявный параметр .В приведенном выше примере подпись map выглядит следующим образом:

def map[B, That](f: (Int) => B)(implicit bf: CanBuildFrom[Array[Int], B, That]): That

Поскольку у нас нет требований к типу для этого, мы можем пока игнорировать это.После того, как мы смотрим в локальную и контейнерную области и не обнаруживаем соответствующих совпадений, следующим местом для поиска неявного объекта будет объект-компаньон для CanBuildFrom.Однако у него нет сопутствующего объекта.Итак, мы продолжаем и смотрим в Array для неявного.Мы находим его в виде

implicit def canBuildFrom[T](implicit m: ClassManifest[T]): CanBuildFrom[Array[_], T, Array[T]]

Поскольку у нас нет требований к типу и неявного соответствия, «That» вынужден иметь тип Array [Int] и завершает нашу типизацию.

7 голосов
/ 28 ноября 2011

На этот вопрос частично ответили другие вопросы о StackOverflow.Позвольте мне попытаться обобщить их:

Первая часть, которую вам нужно знать, - это то, где компилятор Scala ищет следствия .Вы можете найти более подробную информацию о CanBuildFrom здесь .

Если вы поняли, что упоминается в ответах о причастностях - вам следует взглянуть на конструкцию Scala Collections.Их иерархия наследования объясняется здесь и для Списка здесь .Все они построены со строителями.Это подробно объясняется в вопросе о breakOut .

Чтобы собрать свои знания, вы должны знать, как подтолкнуть Коллекции.Также это объясняется в StackOverflow в этом вопросе .

Обратите внимание, что лучшие ответы по StackOverflow обобщены в Scala-Tag-Wiki .

...