多くの値が等しいかどうかを確認し、場合によっては共通の値を抽出する必要があることがよくあります。つまり、次のように機能する関数が必要です。
extract(List()) // None
extract(List(1,2,3)) // None
extract(List(2,2,2)) // Some(2)
seqsに追加tailOption
する pimp があると仮定すると (1 つ書くのは簡単で、scalaz に 1 つある)、1 つの実装は次のようになります。
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 にあるのでしょうか、それとももっと簡単に書く方法はありますか?