수색…


비고

Pattern Matching은 여러 if / else if / else 스타일 구문을 사용하는 것과 비교하여 분기를 매우 간결하게 처리 할 수있게 해주므로 많은 함수 언어의 강력한 기능입니다. 그러나 충분한 옵션과 "언제"경호원이 주어 지 더라도 패턴 매칭은 장황하고 이해하기 어렵게 될 수 있습니다.

F #의 활성 패턴 은 일치하는 논리에 의미있는 이름을 부여하는 좋은 방법이 될 수 있습니다. 이는 코드를 단순화하고 재사용을 가능하게합니다.

일치 옵션

옵션을 처리하는 데 패턴 일치가 유용 할 수 있습니다.

let result = Some("Hello World")
match result with
| Some(message) -> printfn message
| None -> printfn "Not feeling talkative huh?"

전체 도메인이 포함 된 패턴 일치 검사

let x = true
match x with
| true -> printfn "x is true"

경고를 낳는다.

C : \ Program Files (x86) \ Microsoft VS 코드 \ Untitled-1 (2,7) : 경고 FS0025 : 불완전한 패턴이이 식과 일치합니다. 예를 들어, 값 'false'는 패턴 (들)에 의해 커버되지 않는 케이스를 나타낼 수있다.

가능한 모든 bool 값이 다 다루어지지 않았기 때문입니다.

bool은 명시 적으로 나열 될 수 있지만 int는 나열하기가 더 어렵습니다.

let x = 5
match x with
| 1 -> printfn "x is 1"
| 2 -> printfn "x is 2"
| _ -> printfn "x is something else"

여기서 우리는 특별한 _ 문자를 사용합니다. _ 은 다른 모든 가능한 경우와 일치합니다.

_ 가 문제를 일으킬 수 있습니다.

우리가 스스로를 창조하는 유형을 생각해 보라.

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk

우리는 다음과 같은 익스텐션과 일치하는 것을 쓸 수 있습니다.

match sobriety with
| Sober -> printfn "drive home"
| _ -> printfn "call an uber"

위의 코드는 의미가 있습니다. 우리는 당신이 냉정하지 않다면 우리는 _ 을 사용하여

나중에이 코드를 리펙토링합니다.

type Sobriety = 
    | Sober
    | Tipsy
    | Drunk
    | Unconscious

F # 컴파일러는 우리에게 경고를 주어야하며 우리가 환자의 진찰을받을 수 있도록 우리의 일치 표현을 리팩토링하도록 요청해야합니다. 대신 일치 표현식은 마치 의식이없는 사람을 조용히 취급합니다. 핵심은 논리적 오류를 피할 수있는 경우 명시 적으로 사례를 나열하도록 선택해야한다는 것입니다.

사례는 위에서 아래로 평가되며 첫 번째 경기가 사용됩니다.

잘못된 사용 :

다음 스 니펫에서 마지막 일치는 사용되지 않습니다.

let x = 4
match x with
| 1 -> printfn "x is 1"
| _ -> printfn "x is anything that wasn't listed above"
| 4 -> printfn "x is 4"

인쇄물

x는 위에 열거되지 않은 모든 것입니다.

올바른 사용법 :

여기에서 x = 1x = 4 는 모두 특정 사례에 부딪히며 다른 모든 것은 기본 사례 _ :에 해당합니다.

let x = 4
match x with
| 1 -> printfn "x is 1"
| 4 -> printfn "x is 4"
| _ -> printfn "x is anything that wasn't listed above"

인쇄물

x는 4입니다.

경비원이 임의 조건을 추가 할 때

type Person = {
    Age : int
    PassedDriversTest : bool }

let someone = { Age = 19; PassedDriversTest = true }

match someone.PassedDriversTest with
| true when someone.Age >= 16 -> printfn "congrats"
| true -> printfn "wait until you are 16"
| false -> printfn "you need to pass the test"


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow