2013-05-18 1 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]?


Код Exemple приходит от этого Scalaz урока: http://eed3si9n.com/learning-scalaz/sum+function.html

В конце автор показывает Exemple предоставления явно Моноид, но он не использовал контекстные рамки:

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]) 

является extactly же, как:

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

Это означает, что независимо от того, как вы определили свой метод sum (либо с контекстом, связанным либо с неявным параметром), вам может явно передавать неявный параметр, как в sum(List(1, 2, 3, 4))(multiMonoid)

Смежные вопросы