如果我有一个零和mappend的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)
}
}
是否有预先存在的构造来表达这一点,或者这在数学上是不正确的?
答案 0 :(得分:2)
如果我没弄错的话Option
应该有一个幺半群,那么简单
def combine[T: Monoid](a: Option[T], b: Option[T]) = a |+| b
应该有用。