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)