これは、 の「最初の」(または「最後の」) モノイド インスタンスの下の合計ですOption
。Scalaz 7 では次のように書ける:
import scalaz._, Scalaz._
val R1 = "[a-c]".r
val R2 = "[d-f]".r
val R3 = "[g-i]".r
val m: Option[String] = List(R1, R2, R3).map(_.findFirstIn("test").first).suml
または、代わりに:
val r1m = R1.findFirstIn("test").first
val r2m = R2.findFirstIn("test").first
val r3m = R3.findFirstIn("test").first
val m: Option[String] = r1m |+| r2m |+| r3m
これらのソリューションはどちらも一致自体を返すことに注意してください。もちろんisDefined
、実装と同じ動作が必要な場合は、これを呼び出すことができます。
余談|+|
ですが、最初のモノイド インスタンスorElse
は標準ライブラリにあるだけなので、Scalaz を使用しなくてもほぼ同じように簡潔に記述できます。
List(R1, R2, R3).map(_.findFirstIn("test")).reduce(_ orElse _)
これはもちろん、Scalaz の使用を否定するものではありません。これにより、抽象化をより明確に捉えることができ、最初または最後Some
が返されるかどうかに関して動作を変更する洗練された方法が提供されるからです。