繁体   English   中英

Scala隐式与隐式参数相对

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM