【问题标题】:Is there a good way to deal with Option[Monoid[T]] mappend operations?有没有处理 Option[Monoid[T]] mappend 操作的好方法?
【发布时间】:2014-11-26 19:07:43
【问题描述】:

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

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

【问题讨论】:

    标签: scala scalaz monoids


    【解决方案1】:

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

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

    应该可以。

    【讨论】:

    • 不就是常规的“第一个Some值”幺半群,它不结合Ts吗?在 Haskell 语言中,OP 正在寻找 liftA2 mappend——也就是说,您可以使用 Option 是一个应用函子或单子来提升 mappend 的事实。希望我更了解 Scala。
    • @luqui 对不起,但我不明白什么是 first Some value monoid。如果我没记错Option 是一个免费的monoid(例如List),它需要实际类型是一个monoid(即T:Monoid),所以如果两个参数都是Some 然后应用mappend价值观
    • 啊 - 是的 - 当然,Option[T] 本身确实有一个 Monoid!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多