加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala,C#等效的F#活动模式

发布时间:2020-12-16 09:22:59 所属栏目:安全 来源:网络整理
导读:F#具有使用户能够扩展模式匹配的功能: let (|Even|Odd|) n = if n % 2 = 0 then Even else Oddmatch 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 parse
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读