我是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]
和
隐式和a:Monoid
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]
答案 0 :(得分:14)
在某些情况下,隐式形式参数不会直接用在将其作为参数的方法体中。相反,它只是变成一个隐式val,传递给另一个需要相同(或兼容)类型的隐式参数的方法。在这种情况下,没有公开的隐式参数列表很方便。
在其他情况下,上下文绑定符号(对于公开隐式参数而言是严格的语法糖)被认为是美学上需要的,即使需要实际参数,因此必须使用implicitly
方法来获取它被认为是优选的。
鉴于两者之间没有语义差异,选择取决于相当主观的标准。
无论你喜欢什么。最后请注意,从一个代码更改为另一个代码也不会破坏任何代码,也不需要重新编译(尽管我不知道SBT是否有足够的区别来放弃重新编译可以看到更改定义的代码)。