繁体   English   中英

使用Applicative Functor匹配3个Scala Regex中的至少一个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM