implicit parameter メモ

まだよくわかってないけどメモ

object Main {
  trait Adder[T] {
    def add(lhs: T, rhs: T): T
  }

  // int型の + 処理
  implicit object IntAdder extends Adder[int] {
    def add(lhs: int, rhs: int): int = lhs + rhs
  }
  
  // String型の + 処理
  implicit object StringAdder extends Adder[String] {
    def add(lhs: String, rhs: String): String = lhs + rhs
  }
  
  // 総称的な + 処理
  def sum[T](ls: List[T])(implicit adder: Adder[T]) = {
    ls.reduceLeft{(l: T, r: T) => adder.add(l, r)}
  }
  
  def main(args : Array[String]) : Unit = {
    println(sum(List(1, 2, 3)))       // 6
    println(sum(List("a", "b", "c"))) // abc
  }
}

関数テンプレートの特殊化みたいなものかな