В scala, почему этот неявный параметр не может быть выведен из той же области?

Я пишу простую утилиту Apache Spark, которая автоматически создает AccumulatorV2 на основе предоставленного начального значения:

  import java.lang

  type Acc[T] = AccumulatorV2[T, T]

  implicit val long1: Long => Acc[lang.Long] = _ => new LongAccumulator()LongAccumulator()

  implicit def double1: Double => Acc[lang.Double] = _ => new DoubleAccumulator()

  def accumulator[T1, T2](
                           initialValue: T1,
                           name: String
                         )(implicit
                           canBuildFrom: T1 => Acc[T2],
                           converter: T1 => T2,
                           sc: SparkContext = SparkContext.getOrCreate()
                         ): Acc[T2] = {

    val acc: Acc[T2] = canBuildFrom(initialValue)
    acc.reset()
    acc.add(initialValue)

    sc.register(acc, name)

    acc
  }

Предполагается, что 2 неявных параметра: canBuildFrom и converter должны предоставляться неявной функцией и предопределенным типом трансляции соответственно. Однако, когда я попытался это назвать:

Metrics.accumulator(0L, "webDriverDispatched")

Я получил следующую информацию об ошибке:

Error:(102, 84) No implicit view available from Long => com.tribbloids.spookystuff.Metrics.Acc[T2].
                          webDriverDispatched: Acc[lang.Long] = Metrics.accumulator(0L, "webDriverDispatched"),
Error:(102, 84) not enough arguments for method accumulator: (implicit canBuildFrom: Long => com.tribbloids.spookystuff.Metrics.Acc[T2], implicit converter: Long => T2, implicit sc: org.apache.spark.SparkContext)com.tribbloids.spookystuff.Metrics.Acc[T2].
Unspecified value parameters canBuildFrom, converter.
                          webDriverDispatched: Acc[lang.Long] = Metrics.accumulator(0L, "webDriverDispatched"),

Почему компилятору scala не удалось найти правильное неявное значение? И что я должен сделать, чтобы это исправить?

0 ответов

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