if/elif/else 식을 사용하면 조건에 따라 논리를 실행할 수 있어요. F#에는 조건에 따라 논리를 실행하는 또 다른, 더 강력한 방법도 있어요: 패턴 일치. 패턴 일치를 사용하면 값을 하나 이상의 _패턴_과 비교할 수 있어요. 이런 패턴의 한 예로, 값을 상수(예: 1 또는 "hello")와 일치시키는 상수 패턴이 있어요.
F#에서 패턴 일치는 match 키워드로 해요:
let describe number =
match number with
| 0 -> "Zero"
| 1 -> "One"
다른 언어의 switch 문과 비슷해 보일 수도 있지만, 패턴 일치는 다른 패턴들과 함께 사용할 때 진가를 발휘해요. 그런 패턴 중 하나가 값을 캡처할 수 있게 해 주는 변수 패턴이에요:
match number with
| 0 -> "Zero"
| i -> sprintf "Non zero: %d" i
어떤 경우에는 패턴에 추가 조건을 붙이고 싶을 수도 있어요. 이를 가드(절)라고 하는데, when 키워드를 사용해 추가할 수 있어요:
match number with
| 0 -> "Zero"
| i when i < 0 -> "Negative number"
가드 절은 유효한 식이면 무엇이든 될 수 있고, 함수를 호출하는 것도 포함돼요.
위 예시에서는 가능한 모든 입력에 대응하는 패턴이 있는 것은 아니에요. 컴파일러는 이를 감지해서 경고를 출력해요. 이를 완전 일치라고 해요. 경고를 해결하려면 모든 경우를 처리해야 해요. 이를 위해 어떤 값과도 일치하는 [와일드카드 패턴][wildcard-pattern]을 사용할 수 있어요:
match number with
| i when i < 0 -> "Negative number"
| _ -> "Positive number"
// No compiler warning
컴파일러는 when 절을 사용해 완전성을 추론할 수 없다는 점에 유의해요:
match number with
| i when i < 0 -> "Negative number"
| i when i >= 0 -> "Positive number"
// Compiler warning
패턴 일치는 값을 위에서 아래로 각 패턴과 비교하면서, 일치하는 패턴을 찾아 그 패턴에 연결된 논리를 실행해요. 패턴의 순서가 중요해요! 따라서 와일드카드 패턴은 항상 match 식의 마지막 패턴이어야 해요.
패턴 일치는 매우 강력하지만, 단순한 조건 논리는 보통 if/else 식으로 더 명확하게 표현할 수 있어요:
let usingPatternMatching number =
match number with
| 0 -> "Zero"
| _ -> "Non-zero"
let usingIfElse number = if number = 0 then "Zero" else "Non-zero"