我正在努力理解类型化,到目前为止,我已经了解了Monoids,这是非常简单的:
object AbstractAlgebra {
case class Pair[A,B](a: A, b: B)
trait Monoid[T] {
def times(t1: T, t2: T): T
def unit: T
}
object Monoid {
implicit object MonoidIntPlus extends Monoid[Int] {
def times(i1: Int, i2: Int) = i1 + i2
def unit = 0
}
implicit object StringMonoid extends Monoid[String] {
def times(s1: String, s2: String) = s1 + s2
def unit = ""
}
implicit object PairOfMonoids extends Monoid[Pair[Monoid, Monoid]] = ???
}
}我想我的问题是Monoid[PairMonoid,Monoid]类型,因为我并没有真正地处理两个单类实例,只有两个类是隐式幺半群,但我不知道如何表达它。
如有任何帮助或推荐人,将不胜感激。
发布于 2017-05-16 21:28:31
Monoid本身并不是一个类型。它是一个类型构造函数,所以Pair[Monoid, Monoid]没有任何意义。
您真正想要的实际上是以下内容:假设您有两个给定类型的Monoid类型类实例A和B,那么也为Pair[A, B]创建一个实例。
这可以如下所示(实现是您可以派生的最自然的实现):
implicit def monoidPair[A, B](implicit A: Monoid[A], B: Monoid[B]): Monoid[Pair[A, B]] = new Monoid[Pair[A, B]] {
def times(p1: Pair[A, B], p2: Pair[A, B]) =
Pair(A.times(p1.a, p2.a), B.times(p1.b, p2.b))
def unit = Pair(A.unit, B.unit)
}这将实现我前面解释的那样:如果找到了Monoid[A]和Monoid[B]类型的隐式实例,那么它将在作用域中放置一个新的Monoid[Pair[A, B]]类型隐式实例。
注意:您的case类Pair[A, B]已经在Predef中定义了(尽管它自2.11.0以来就被废弃了),被定义为Tuple2[A, B]或(A, B)。
其他注意事项.如果不喜欢将隐式实例定义为def或val,则可以对隐式类执行相同的操作:
implicit class MonoidPair[A, B](implicit A: Monoid[A], B: Monoid[B]) extends Monoid[Pair[A, B]] {
... //same body as before
}https://stackoverflow.com/questions/44011731
复制相似问题