Scala implizit gegen implizite Argumente

Ich bin neu in Scala und wenn ich mir verschiedene Projekte anschaue, sehe ich zwei Stile für den Umgang mit impliziten Argumenten

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

und

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

Basierend auf der Art beider Funktionen stimmen sie überein. Gibt es einen Unterschied zwischen den beiden? Warum sollten Sie implizite Argumente implizit überschreiben? In diesem einfachen Beispiel wirkt es ausführlicher.

Wenn ich das Obige in der REPL mit etwas ausführe, das kein Implizit hat, erhalte ich die folgenden Fehler

mit implizitem param

<console>:11: error: could not find implicit value for parameter m: Monoid[String]

und

mit implizit und a: Monoid

<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]

Antworten auf die Frage(1)

Ihre Antwort auf die Frage