Skip to content

Instantly share code, notes, and snippets.

@lshoo
Created May 23, 2014 13:34
Show Gist options
  • Save lshoo/49ac78a4d3092c9e1eea to your computer and use it in GitHub Desktop.
Save lshoo/49ac78a4d3092c9e1eea to your computer and use it in GitHub Desktop.
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]
是什么原因?
@freewind
Copy link

你的方法声明错了,应该是:

def accImply[T:Monoid](list: List[T]) = {
  val m = implicitly[Monoid[T]]
  list.foldLeft(m.zero)(m.append)
}

注意: T:Monoid

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment