首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala隐式与隐式参数

Scala隐式与隐式参数
EN

Stack Overflow用户
提问于 2014-03-26 17:54:12
回答 1查看 4.5K关注 0票数 14

我是Scala的新手,当我查看不同的项目时,我看到了处理隐式参数的两种样式。

代码语言:javascript
复制
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

代码语言:javascript
复制
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中使用没有隐式的内容运行上面的内容时,我会得到以下错误

隐式

代码语言:javascript
复制
<console>:11: error: could not find implicit value for parameter m: Monoid[String]

与隐式和a:

代码语言:javascript
复制
<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-26 18:38:18

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

在其他情况下,上下文约束表示法(对于显性隐式参数严格来说是语法糖)在美学上被认为是可取的,即使需要实际参数,因此必须使用implicitly方法才能得到它。

考虑到两者之间没有语义差异,选择是基于相当主观的标准。

想做什么就做什么。最后,请注意,从一个更改到另一个并不会破坏任何代码,也不会需要重新编译(虽然我不知道SBT是否足够区分以放弃可以看到更改定义的重新编译代码)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22669233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档