2013-05-18 29 views
3

在下面的代碼:是否明確提供了可能在Scala中的上下文綁定?

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

在末尾,作者展示提供了明確的含半幺羣的爲例,但他並沒有使用上下文範圍:

scala> val multiMonoid: Monoid[Int] = new Monoid[Int] { 
     def mappend(a: Int, b: Int): Int = a * b 
     def mzero: Int = 1 
     } 
multiMonoid: Monoid[Int] = [email protected] 

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

回答

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)

相關問題