Scala隐式与隐式参数相对

时间:2014-03-26 17:54:12

标签: scala implicit

我是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]

1 个答案:

答案 0 :(得分:14)

在某些情况下,隐式形式参数不会直接用在将其作为参数的方法体中。相反,它只是变成一个隐式val,传递给另一个需要相同(或兼容)类型的隐式参数的方法。在这种情况下,没有公开的隐式参数列表很方便。

在其他情况下,上下文绑定符号(对于公开隐式参数而言是严格的语法糖)被认为是美学上需要的,即使需要实际参数,因此必须使用implicitly方法来获取它被认为是优选的。

鉴于两者之间没有语义差异,选择取决于相当主观的标准。

无论你喜欢什么。最后请注意,从一个代码更改为另一个代码也不会破坏任何代码,也不需要重新编译(尽管我不知道SBT是否有足够的区别来放弃重新编译可以看到更改定义的代码)。