我是 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]
使用隐含的 "and" 和一个 Monoid:
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]
sum(List(1,2,3))(m=someMonoidInstance)
。将声明中的隐式参数替换为上下文界定将会将隐式参数名称从“m”更改为类似于“evidence$1”的内容,从而破坏上述调用。参数名称(包括隐式参数)是界面的一部分,既有好处也有坏处。吹毛求疵,但仍然很重要。 - Régis Jean-Gilles