如果我有一个具有零和映射的 Monoid[T],那么在我看来,逻辑上的结果是
implicit myMonoid: Monoid[T] = ...
val x: T = thing()
val y: Option[T] = none[T]
val z: Option[T] = Some(value)
val a: T = x.mappend(y)
val b: T = x.mappend(z)
val i: T = y.mappend(x)
val j: T = z.mappend(x)
对于 a 和 b 应该分别是 identity 和 x.mappend(z.get) 。对于 i 和 j 也是如此。
我现在拥有的看起来像:
def combine(a: Option[T], b: Option[T]) = {
a match {
case None => b
case Some(x) => x |+| b.getOrElse(myMonoid.zero)
}
}
是否有一个预先存在的结构来表达这一点,或者这在数学上是不正确的?