Обратите внимание, что второй аргумент map
является неявным аргументом. должен быть неявным в области видимости с соответствующими типами, или, в противном случае, вы должны передать такой аргумент.
В вашем примере That
должно быть Set[String]
, B должно быть Int
и Repr
должно быть List[String]
. Следовательно, для этого вам необходим следующий неявный объект в области видимости:
implicit object X: CanBuildFrom[List[String], Int, Set[String]]
Нет такой вещи в области видимости. Кроме того, breakOut
не может предоставить его, потому что сам по себе нуждается в неявном CanBuildFrom
, первым типом которого может быть любой класс (противоположный вариант Nothing
), но в остальном ограниченный другими типами.
Посмотрите, например, на фабрику CanBuildFrom
от объекта-компаньона List
:
implicit def canBuildFrom [A] : CanBuildFrom[List, A, List[A]]
Поскольку второй и третий параметры связываются с помощью A
, неявный вопрос не будет работать.
Итак, как узнать, где искать такие последствия? Прежде всего, Scala импортирует несколько вещей во все области. Прямо сейчас я могу вспомнить следующий импорт:
import scala.package._ // Package object
import scala.Predef._ // Object
// import scala.LowPriorityImplicits, class inherited by Predef
import scala.runtime._ // Package
Поскольку мы обеспокоены последствиями, имейте в виду, что при импорте объектов из пакетов возможны только последствия синглтонов. С другой стороны, когда вы импортируете вещи из объектов (синглетонов), вы можете иметь неявные определения, значения и синглтоны.
Прямо сейчас, есть CanBuildFrom
имплики внутри Predef
и LowPriorityImplicits
, которые связаны со строками. Они позволяют нам писать "this is a string" map (_.toInt)
.
Итак, если не принимать во внимание этот автоматический импорт и выполняемый вами явный импорт, где еще можно найти неявный? Одно место: сопутствующие объекты экземпляра, к которому применяется метод.
Я говорю сопутствующий объект s во множественном числе, потому что сопутствующие объекты всех признаков и классов, унаследованных классом рассматриваемого экземпляра, могут содержать соответствующие импликации. Я не уверен, что сам экземпляр может содержать неявный. Если честно, я не могу сейчас воспроизвести это, поэтому я, безусловно, совершаю здесь какую-то ошибку.
В любом случае, загляните внутрь сопутствующих объектов.