Scala Monoid Combinator选项

时间:2017-04-20 10:25:05

标签: scala monoids

假设我有一个Monoid特征如下:

'stackoverflow'[::-1]

现在,如果我想为此编写一个optionMonoid,我可以这样写:

trait Monoid[A] {
  def combine(a1: A, a2: A): A
  def identity: A
}

这是因为我对Option中的内部类型一无所知。但是,如果我想以这样的方式使用combine运算符,我想真正组合Option中的内部类型呢?

1 个答案:

答案 0 :(得分:6)

一个选项:

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
}

很容易验证幺半群定律。