用于选项的 Scala Monoid 组合器
Scala Monoid Combinator for Options
假设我有如下 Monoid 特征:
trait Monoid[A] {
def combine(a1: A, a2: A): A
def identity: A
}
现在如果我想为此写一个 optionMonoid,我可以这样写:
val optionMonoid1 = new Monoid[Option[A]] {
def combine(a1: Option[A], a2: Option[A2]) a1 orElse a2
def identity = None
}
考虑到我对选项中的内部类型一无所知。但是,如果我想以这样一种方式使用组合运算符,以便真正组合 Option 中的内部类型怎么办?
一个选项:
trait Semigroup[A] {
def combine(a1: A, a2: A): A
}
trait Monoid[A] extends Semigroup[A] {
def identity: A
}
def optionMonoid2[A](implicit sgA: Semigroup[A]) = new Monoid[Option[A]] {
def combine(a1: Option[A], a2: Option[A2]) = (a1, a2) match {
case (Some(b1), Some(b2)) => Some(sgA.combine(b1, b2))
case _ => a1.orElse(a2)
}
def identity = None
}
验证幺半群定律成立很容易。
假设我有如下 Monoid 特征:
trait Monoid[A] {
def combine(a1: A, a2: A): A
def identity: A
}
现在如果我想为此写一个 optionMonoid,我可以这样写:
val optionMonoid1 = new Monoid[Option[A]] {
def combine(a1: Option[A], a2: Option[A2]) a1 orElse a2
def identity = None
}
考虑到我对选项中的内部类型一无所知。但是,如果我想以这样一种方式使用组合运算符,以便真正组合 Option 中的内部类型怎么办?
一个选项:
trait Semigroup[A] {
def combine(a1: A, a2: A): A
}
trait Monoid[A] extends Semigroup[A] {
def identity: A
}
def optionMonoid2[A](implicit sgA: Semigroup[A]) = new Monoid[Option[A]] {
def combine(a1: Option[A], a2: Option[A2]) = (a1, a2) match {
case (Some(b1), Some(b2)) => Some(sgA.combine(b1, b2))
case _ => a1.orElse(a2)
}
def identity = None
}
验证幺半群定律成立很容易。