[英]Matching at least 1 of 3 Scala Regexes using an Applicative Functor
我有三个Scala正则表达式,我需要测试它们是否与给定的String匹配。
我知道我可以做以下事情:
val matches = R1.findFirstIn(myString).isDefined ||
R2.findFirstIn(myString).isDefined ||
R3.findFirstIn(myString).isDefined
但我相信有一种方法可以使用Scalaz库中的Applicative Functor或Monad来实现。
如何才能做到这一点?
这是Option
的“first”(或“last”)monoid实例下的总和。 在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
。
作为旁注, |+|
对于第一个monoid实例,这里只是标准库中的orElse
,所以你可以在没有Scalaz的情况下简洁地编写它:
List(R1, R2, R3).map(_.findFirstIn("test")).reduce(_ orElse _)
这当然是不反对使用Scalaz,因为它让我们捕捉到抽象更干净,并提供了一个优雅的方式就改变行为是否第一个或最后一个参数Some
被返回。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.