我是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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
根据两种功能的类型,它们匹配.这两者有区别吗?为什么要隐式使用隐式参数?在这个简单的例子中,它感觉更加冗长.
当我在REPL中运行上面没有隐含的东西时,我得到以下错误
隐含的参数
<console>:11: error: could not find implicit value for parameter m: Monoid[String]
Run Code Online (Sandbox Code Playgroud)
和
隐式地和a:Monoid
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]
Run Code Online (Sandbox Code Playgroud)
Ran*_*ulz 15
在某些情况下,隐式形式参数不会直接用在将其作为参数的方法体中.相反,它只是变成一个隐式val,传递给另一个需要相同(或兼容)类型的隐式参数的方法.在这种情况下,没有公开的隐式参数列表是方便的.
在其他情况下,上下文绑定符号(对于明显的隐式参数而言是严格的语法糖)被认为是美学上合乎需要的,即使需要实际参数,因此implicitly必须使用该方法来使其被认为是优选的.
鉴于两者之间没有语义差异,选择取决于相当主观的标准.
做你喜欢的任何一个.最后请注意,从一个更改为另一个不会破坏任何代码也不需要重新编译(尽管我不知道SBT是否足以区分重新编译可以看到更改定义的代码).