Fahad/CodeSamples/ImplicitParameters.scala
changeset 44 a751aa1ee4f7
equal deleted inserted replaced
43:10e7a90d8e7a 44:a751aa1ee4f7
       
     1 package Main
       
     2 
       
     3 abstract class SemiGroup[A] {
       
     4   def add(x: A, y: A): A
       
     5 }
       
     6 
       
     7 abstract class Monoid[A] extends SemiGroup[A] {
       
     8   def unit: A
       
     9 }
       
    10 
       
    11 object ImplicitTest extends App {
       
    12   implicit object StringMonoid extends Monoid[String] {
       
    13     def add(x: String, y: String): String = x concat y
       
    14     def unit: String = ""
       
    15   }
       
    16 
       
    17   implicit object IntMonoid extends Monoid[Int] {
       
    18     def add(x: Int, y: Int): Int = (x + y)
       
    19     def unit: Int = 0
       
    20   }
       
    21 
       
    22   def sum[A](xs: List[A])(implicit m: Monoid[A]): A =
       
    23     if (xs.isEmpty) m.unit
       
    24     else {
       
    25       println("head: " + xs.head);
       
    26       println("tail: " + xs.tail);
       
    27       m.add(xs.head, sum(xs.tail))
       
    28     }
       
    29 
       
    30   println(sum(List(1, 2, 3)))
       
    31   println(sum(List("a", "b", "c")))
       
    32 }