簡體   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