scala/ScalaBook/chapter-03/monoid.scala
trait Monoid[α] {
val unit :α
def add(x:α, y:α):α
}
implicit object strMonoid extends Monoid[String] {
val unit = ""
def add (x: String, y: String) = x.concat(y)
}
implicit object intMonoid extends Monoid[Int] {
val unit = 0
def add (x: Int, y: Int) = x+y
}
def sum[α](A:List[α])(implicit m:Monoid[α]):α =
A match {
case Nil => m.unit
case x::xs => m.add(x,sum(xs)(m))
}
def L1 = List(1,2,3,4,5,6,7,8,9,10)
def L2 = List("a","b","c","d","e","f")
var res1 = sum(L1)
var res2 = sum(L2)