F # - Шаблон сопоставления распознаваемого объединения и доступа к свойствам объекта - PullRequest
0 голосов
/ 11 января 2019

из F # tour У меня есть этот пример

type Person = {
    First : string
    Last  : string
 }

/// A Discriminated Union of 3 different kinds of employees
type Employee =
    | Engineer of engineer: Person
    | Manager of manager: Person * reports: List<Employee>
    | Executive of executive: Person * reports: List<Employee> * assistant: Employee

let rec findDaveWithOpenPosition(emps: List<Employee>) = 
    emps
    |> List.filter(function 
                    | Manager({First =  "Dave"}, []) -> true
                    | Executive({First = "Dave"}, [], _) -> true
                    | _ -> false
                    )

Однако я хотел бы получить доступ к объекту после сопоставления объекта, что-то вроде этого:

let rec findDaveWithOpenPos2(emps: List<Employee>) =
    List.filter (fun (e:Employee) ->
                    match e with
                        | Manager({First = "Dave"}, []) -> e.Last.Contains("X") //Does not compile
                        | Executive({First = "Dave"}, [], _) -> true
                        | _ -> false
                    ) emps

Так что я хотел бы, чтобы в качестве статической переменной «e» в правой части окна была указана переменная Person, Employee или Manager с доступом к ее свойствам. Является ли это возможным? Есть ли лучшая конструкция?

1 Ответ

0 голосов
/ 11 января 2019

Вы можете назвать экземпляр Person в случае Manager, используя as:

let rec findDaveWithOpenPos2(emps: Employee list) =
    List.filter (fun (e:Employee) ->
                    match e with
                        | Manager({First = "Dave"} as p, []) -> p.Last.Contains("X")
                        | Executive({First = "Dave"}, [], _) -> true
                        | _ -> false
                    ) emps
...