我搞乱了代数结构,我发现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)
}
答案 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()
}