Удаление вложенных совпадений в F #? - PullRequest
1 голос
/ 14 июня 2019

Предположим, у меня есть такие типы:

type C = 
  | W of int
  | Z of int

type B = 
  {
    C : C
    D : int
  }

type A = 
  | X of int
  | Y of B

И я хотел бы сделать что-то для Z дела * только 1005 * :

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

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

Есть ли способ достичь этого за один match?

Можно ли сделать это более кратким?

1 Ответ

5 голосов
/ 14 июня 2019

Да, действительно есть!Паттерны могут быть вложенными , это их основная точка.Вы можете найти совпадения на Y, и внутри этого совпадения на полях B, а внутри этого совпадения на C.

Примерно так:

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

И так как вы возвращаете единицу в обоих не Y.C.Z случаях, вы можете объединить их в универсальном шаблоне:

match a with
| Y { C = Z z } -> printfn "%i" z
| _ -> ()
...