删除F#中的嵌套匹配?

sdg*_*sdh 1 f# pattern-matching

假设我有这样的类型:

type C = 
  | W of int
  | Z of int

type B = 
  {
    C : C
    D : int
  }

type A = 
  | X of int
  | Y of B
Run Code Online (Sandbox Code Playgroud)

我想为世博会做些事Z的情况下

let a = 
  Y 
    { 
      C = Z 123 
      D = 456
    }

match a with
| X _ -> ()
| Y b -> 
  match b.C with
  | W _ -> ()
  | Z z -> printfn "%i" z
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以做到这一点match

可以使它更简洁吗?

Fyo*_*kin 5

是的,确实有!模式可以嵌套,这是它们的主要要点。您可以Y在的字段上进行B匹配,并在内进行匹配,在上进行匹配C

像这样:

match a with
| X _ -> ()
| Y { C = Z z } -> printfn "%i" z
| Y { C = W _ } -> ()
Run Code Online (Sandbox Code Playgroud)

而且由于您在两种Y.C.Z情况下都返回单位,因此可以将它们组合成一种通用模式:

match a with
| Y { C = Z z } -> printfn "%i" z
| _ -> ()
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这仅适用于记录。您无法匹配对象或接口属性。 (2认同)