Я новичок в Scala, и когда я смотрю на разные проекты, я вижу два стиля для работы с неявными аргументами
scala]]>def sum[A](xs:List[A])(implicit m:Monoid[A]): A = xs.foldLeft(m.mzero)(m.mappend)
sum:[A](xs:List[A])(implicit m:Monoid[A])A
и
scala]]>def sum[A:Monoid](xs:List[A]): A ={
val m = implicitly[Monoid[A]]
xs.foldLeft(m.mzero)(m.mappend)
}
sum:[A](xs:List[A])(implicit evidence$1:Monoid[A])A
В зависимости от типа обеих функций они совпадают. Есть ли разница между этими двумя? Почему вы хотите неявно использовать неявные аргументы? В этом простом примере он выглядит более подробным.
Когда я запускаю вышеуказанное в REPL с чем-то, у которого нет неявного, я получаю следующие ошибки
с неявным параметром
<console>:11: error: could not find implicit value for parameter m: Monoid[String]
и
с неявным образом и a: Monoid
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]