Я просмотрел руководство по скалязу.
Из этой ссылки я понимаю следующий код:
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> implicit val intMonoid = IntMonoid
intMonoid: IntMonoid.type = IntMonoid$@3387dfac
scala> sum(List(1, 2, 3, 4))
res9: Int = 10
Но я не понимаю следующий код:
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
scala> sum(List(1, 2, 3, 4))
res10: Int = 10
Если мы рассмотрим List(1, 2, 3, 4)
, A
- это Int
.
Итак, как мы можем иметь A
Monoid
и A
Int
в def sum[A: Monoid](xs: List[A]): A = {
?
Спасибо