用于选项的 Scala Monoid 组合器

标签 scala monoids

假设我有如下的 Monoid 特征:

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

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

val optionMonoid1 = new Monoid[Option[A]] {
  def combine(a1: Option[A], a2: Option[A2]) a1 orElse a2
  def identity = None
}

这是因为我对选项中的内部类型一无所知。但是,如果我想让组合运算符真正组合 Option 中的内部类型怎么办?

最佳答案

一个选项:

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
}

验证幺半群定律成立很容易。

关于用于选项的 Scala Monoid 组合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43516863/

相关文章:

java - 在 Java/scala 中将日期时间转换为纪元时间损失一小时

scala - 在 scalaz 中构造每个节点的 TreeLoc 的树

scala - 使用内部类作为类型参数

haskell - monads Writer m 和 Either e 是绝对对偶的吗?

haskell,IO Monoid 关联性被打破了吗?

haskell - 关联和交换之间的区别

string - 在 Haskell 中 Maybe String 和 Maybe Int 都是幺半群吗?

scala - Java <-> Scala 集合转换,Scala 2.10

linux - 对于本地运行的 scala spray 服务器,curl localhost 有效,但 curl <local ip> 获取 "Connection refused"

haskell - 在 Haskell 中导入时隐藏类型类实例声明