Scala,C#等效的F#活动模式
F#具有使用户能够扩展模式匹配的功能:
let (|Even|Odd|) n = if n % 2 = 0 then Even else Odd match 3 with | Odd -> printfn "odd" | Even -> printfn "even" 要么: (** Parsing date from any of the formats: MM/DD/YY,MM/DD/YYYY,YYYY-MM-DD *) let parseDate = function | ParseRegex "(d{1,2})/(d{1,2})$" [Integer m; Integer d; Integer y] -> new DateTime(y + 2000,m,d) | ParseRegex "(d{1,2})/(d{3,4})" [Integer m; Integer d; Integer y] -> new DateTime(y,4})-(d{1,2})-(d{1,2})" [Integer y; Integer m; Integer d] -> new DateTime(y,d) ParseRegex模式中的魔法发生在如下定义: (** Definition of the MatchRegex active pattern *) let (|ParseRegex|_|) rgx s = match Regex(rgx).Match(s) with | m when not m.Success -> None | m -> Some(List.tail [for x in m.Groups->x.Value]) ParseRegex现在可以在任何地方使用,并且它的全部要点是可以非常简洁的方式来解析部分字符串. Scala有类似的功能吗? 在C#中,这个简洁程度似乎很难实现,但也许使用隐式转换的一些聪明的技巧可以帮助? 解决方法
免责声明:我不知道F#.
在scala中,如果值具有名为unapply(或unapplySeq)的方法,则将在模式匹配中使用. 未应用的定义是: object Example { def unapply(t: T): Option[(T1,...,Tn)] = ... } 如果返回None,则表示不匹配,Some((t1,…,tn))表示匹配成功,可以绑定到t1到tn 然后它可以用作: value match { case Example(t1,tn) => ... } 如果匹配可以具有动态数量的结果,则使用返回Option [List [T]]的unapplySeq 最后,如果在匹配时不需要绑定变量,则取消应用可以返回一个布尔值 例子: val Date = ""(d{1,2})$".r "12/12/12" match { case Date(m,d,y) => ... } .r方法将一个字符串转换为正则表达式.该类有一个unapplySeq方法匹配正则表达式中的组. case class Person(name: String,age: Int) somePerson match { case Person(name,age) => ... } 在这种情况下,语法case类将使用与构造函数参数匹配的unapply方法创建一个具有相同名称(Person)的单例对象. 更新:下面是如何定义Even和Odd class BooleanExtractor[T](f: T => Boolean) { def unapply(t: T) = f(t) } 现在我们可以这样使用(显示两种方式) val Even = new BooleanExtractor[Int](_ % 2 == 0) object Odd extends BooleanExtractor[Int](_ % 2 == 1) 并使用: scala> 3 match { | case Even() => println("even") | case Odd() => println("odd") | } odd (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |