[英]Scala implicitly vs implicit arguments
我是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]
在某些情况下,隐式形式参数不会直接用在将其作为参数的方法体中。 相反,它只是变成一个隐式val,传递给另一个需要相同(或兼容)类型的隐式参数的方法。 在这种情况下,没有公开的隐式参数列表是方便的。
在其他情况下,上下文绑定符号(对于公开隐式参数而言是严格的语法糖)被认为是美学上合乎需要的,即使需要实际参数,因此必须使用implicitly
方法来使其被认为是优选的。
鉴于两者之间没有语义差异,选择取决于相当主观的标准。
做你喜欢的任何一个。 最后请注意,从一个更改为另一个不会破坏任何代码也不需要重新编译(尽管我不知道SBT是否足以区分重新编译可以看到更改定义的代码)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.