Created
May 23, 2014 13:34
-
-
Save lshoo/49ac78a4d3092c9e1eea to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
object SemiGroupApp { | |
trait SemiGroup[T] { | |
def append(a: T, b: T): T | |
} | |
/*object IntSemiGroup extends SemiGroup[Int] { | |
def append(a: Int, b: Int) = a + b | |
}*/ | |
trait Monoid[T] extends SemiGroup[T] { | |
// 定义单位元 | |
def zero: T | |
} | |
object IntMonoid extends Monoid[Int] { | |
// 二元操作 | |
override def append(a: Int, b: Int) = a + b | |
// 单位元 | |
override def zero = 0 | |
} | |
/*object StringMonoid extends Monoid[String] { | |
override def append(a: String, b: String) = a + b | |
override def zero = "" | |
}*/ | |
implicit val strMonoid = new Monoid[String] { | |
override def append(a: String, b: String) = a + b | |
override def zero = "" | |
} | |
implicit val intMonoid = new Monoid[Int] { | |
def append(a: Int, b: Int) = a + b | |
def zero = 0 | |
} | |
def listMonoid[T] = { | |
new Monoid[List[T]] { | |
override def append(a: List[T], b: List[T]) = a ++ b | |
override def zero = Nil | |
} | |
} | |
def acc[T](list: List[T], m: Monoid[T]) = { | |
list.foldLeft(m.zero)(m.append) | |
} | |
def accImpl[T](list: List[T])(implicit m: Monoid[T]) = { | |
list.foldLeft(m.zero)(m.append) | |
} | |
def accImply[T](list: List[T]) = { | |
val m = implicitly[Monoid[T]] | |
list.foldLeft(m.zero)(m.append) | |
} | |
def main(args: Array[String]) { | |
val lm = accImply(List(1, 2, 3)) | |
println(lm) | |
} | |
第60行提示:could not find implicit value for parameter e: SemiGroupApp.Monoid[T] | |
是什么原因? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
你的方法声明错了,应该是:
注意: T:Monoid