是否在Scala中明确提供了上下文绑定?

时间:2013-05-18 12:41:23

标签: scala scalaz

在以下代码中:

   def sum[A: Monoid](xs: List[A]): A = {
     val m = implicitly[Monoid[A]]
     xs.foldLeft(m.mzero)(m.mappend)
   }

如果我的范围中已有Monoid[Int] mappend = _ + _,我可以使用具有不同行为的显式Monoid[Int]来调用我的函数吗?或者唯一的解决方案是使用更详细的语法和第二个参数implicit monoid: Monoid[Int]


代码示例来自此Scalaz教程:http://eed3si9n.com/learning-scalaz/sum+function.html

最后,作者展示了明确提供Monoid的例子,但他没有使用上下文界限:

scala> val multiMonoid: Monoid[Int] = new Monoid[Int] {
         def mappend(a: Int, b: Int): Int = a * b
         def mzero: Int = 1
       }
multiMonoid: Monoid[Int] = $anon$1@48655fb6

scala> sum(List(1, 2, 3, 4))(multiMonoid)
res14: Int = 24

1 个答案:

答案 0 :(得分:3)

上下文界限只不过是语法糖。 以下内容:

def sum[A: Monoid](xs: List[A])

与以下内容完全相同:

def sum[A](xs: List[A])(implicit evidence: Monoid[A])

这意味着无论您如何定义sum方法(使用上下文绑定或使用隐式参数),都可以显式传递隐式参数,如sum(List(1, 2, 3, 4))(multiMonoid)