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]