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




与隐式和一个:Monoid

<console>:11: error: could not find implicit value for evidence parameter of type Monoid[String]

最佳答案

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

在其他情况下,上下文绑定表示法(对于明显的隐式参数严格来说是语法糖)在美学上被认为是理想的,即使需要实际参数,因此必须使用implicitly方法将其视为首选。

鉴于两者之间没有语义上的差异,因此选择是基于相当主观的标准。

做任何你喜欢的事。最后要注意的是,从一个更改为另一个不会破坏任何代码,也不需要重新编译(尽管我不知道SBT是否具有足够的区分性,从而放弃了重新编译可以看到更改的定义的代码)。

关于scala - Scala隐式vs隐式参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22669233/

10-13 06:02