我是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:
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]发布于 2014-03-26 18:38:18
在某些情况下,隐式形式参数不直接用于作为参数的方法的主体。相反,它只是成为一个隐式val,然后传递给另一个需要相同(或兼容)类型的隐式参数的方法。在这种情况下,没有显式隐式参数列表是方便的。
在其他情况下,上下文约束表示法(对于显性隐式参数严格来说是语法糖)在美学上被认为是可取的,即使需要实际参数,因此必须使用implicitly方法才能得到它。
考虑到两者之间没有语义差异,选择是基于相当主观的标准。
想做什么就做什么。最后,请注意,从一个更改到另一个并不会破坏任何代码,也不会需要重新编译(虽然我不知道SBT是否足够区分以放弃可以看到更改定义的重新编译代码)。
https://stackoverflow.com/questions/22669233
复制相似问题