Какой экземпляр CanBuildFrom обнаруживает компилятор Scala?

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

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

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

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

2 ответа

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

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] и завершает нашу типизацию.

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

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

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

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

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

Другие вопросы по тегам