2017-12-23 8 views
4

튜플을 생성하기 위해 식별자 패턴의 결과를 as 패턴에 복사하는 방법은 무엇입니까?'as'패턴으로 식별자 패턴 결합

type Person = 
    | Teacher of name: string * age: int * classIds: int list 
    | Student of name: string 

let printTeacher (name, age, classIds) = 
    printfn "Teacher: %s; Age: %d; Classes: %A" name age classIds 

let print = function 
    | Teacher (name, age, classIds) -> printTeacher (name, age, classIds) 
    | Student name -> printfn "Student: %s" name 

일치하는 패턴이 길고 반복이다 :

내 질문은 혼란, 그래서 예를 작성, 나는 교사 또는 학생 중 하나가 사람의 정보를 인쇄 할

| Teacher (name, age, classIds) -> printTeacher (name, age, classIds) 

그래서 나는 as 패턴을 사용하여이 짧게하려했으나 실패

| Teacher ((_, _, _) as teacher) -> printTeacher teacher 

위의 teacher에는 Person 유형이 있고 string*int*int list이 아니기 때문에 printTeacher 유형 서명 string*int*int list -> unit을 변경하지 않고 짧은 패턴으로 처리하려면 어떻게해야합니까? 내가 생각할 수있는

답변

3

한 가지 방법은 Teacher 생성자의 정의를 변경하는 것입니다 : 명시 적 튜플을 위해 Teacher을 변경하여

type Person = 
    | Teacher of items: (string * int * int list) 
    | Student of name: string 

let printTeacher (name, age, classIds) = 
    printfn "Teacher: %s; Age: %d; Classes: %A" name age classIds 

let print = function 
    //| Teacher (name, age, classIds) -> printTeacher (name, age, classIds) // Still works 
    | Teacher items -> printTeacher items 
    | Student name -> printfn "Student: %s" name 

을, 당신은 이름으로 참조 할 수 있지만, 다른 방법은 여전히 ​​작동 게다가.

튜플 항목에 이름을 지정하는 기능이 없어지지만.

type Person = 
    | Teacher of name: string * age: int * classIds: int list 
    | Student of name: string 

// Active pattern to extract Teacher constructor into a 3-tuple. 
let (|TeacherTuple|_|) = function 
| Teacher (name, age, classIds) -> Some (name, age, classIds) 
| _ -> None 

let printTeacher (name, age, classIds) = 
    printfn "Teacher: %s; Age: %d; Classes: %A" name age classIds 

let print = function 
    | TeacherTuple items -> printTeacher items 
    | Student name -> printfn "Student: %s" name 
    // To make the compiler happy. It doesn't know that the pattern matches all Teachers. 
    | _ -> failwith "Unreachable." 
:

당신이하고 싶지 않은 유형 정의를 변경할 수없는 경우, 다른 방법은 교사 생성자에 대한 활성 패턴을 소개하는 것입니다