Scala中的所有序列都有类型类吗?

时间:2016-03-14 09:46:00

标签: scala

我搞乱了代数结构,我发现Numeric类型类非常方便,代表数值。

所以我可以这样写我的monoid实例:

implicit def add[A: Numeric] = new Monoid[A] {
  def mempty = implicitly[Numeric[A]].zero
  def mappend(a0: A, a1: A) = implicitly[Numeric[A]].plus(a0, a1)
}

这看起来像个花花公子。但是我能用序列做些什么呢?我无法找到执行标准Scala集合序列的类型类。我想写这样的东西:

def concat[A : SeqTC] = new Monoid[A] {
  def mempty = implicitly[SeqTC[A]].empty
  def mappend(a0: A, a1: A) = implicitly[SeqTC[A]].++(a0, a1)
}

1 个答案:

答案 0 :(得分:1)

根据@ TrustNoOne的评论,这就是我要做的事情。而且效果很好。

def concat[A, S[A] <: Seq[A]](implicit bf: CanBuildFrom[S[A], A, S[A]]) = new Monoid[S[A]] {
  def mempty = bf().result()
  def mappend(a0: S[A], a1: S[A]) = bf.apply().++=(a0).++=(a1).result()
}