我经常需要检查许多值是否相等,以防提取共同值。也就是说,我需要一个功能如下:
extract(List()) // None
extract(List(1,2,3)) // None
extract(List(2,2,2)) // Some(2)
假设一个有一个会添加tailOption
到 seqs 的皮条客(写一个或在 scalaz 中有一个是微不足道的),一个实现看起来像
def extract[A](l: Seq[A]): Option[A] = {
def combine(s: A)(r: Seq[A]): Option[A] =
r.foldLeft(Some(s): Option[A]) { (acc, n) => acc flatMap { v =>
if (v == n) Some(v) else None
} }
for {
h <- l.headOption
t <- l.tailOption
res <- combine(h)(t)
} yield res
}
Scalaz 中是否有类似的东西——可能更普遍——或者更简单的编写方式?