equal
deleted
inserted
replaced
|
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 } |