1

如果我有一个具有零和映射的 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)
    }
}

是否有一个预先存在的结构来表达这一点,或者这在数学上是不正确的?

4

1 回答 1

2

如果我没记错的话应该有一个幺半群 for Option,那么简单

def combine[T: Monoid](a: Option[T], b: Option[T]) = a |+| b

应该管用。

于 2014-11-26T19:17:14.137 回答