在以下代码中:
def sum[A: Monoid](xs: List[A]): A = {
val m = implicitly[Monoid[A]]
xs.foldLeft(m.mzero)(m.mappend)
}
如果我的范围内已经有 a 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