Scala неявно против неявных аргументов
Я новичок в 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]
а также
с неявным и выраженным: моноид
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]