개요

패턴 매칭은 일련의 토큰들이 특정 패턴에 포함되는지를 판단하는 구문을 말한다. 패턴매칭은 Modern programming langauge에서 많이 사용되며, 특히 함수형 언어혹은 함수형 언어의 특징을 포함하는 언어들에서 많이 사용된다. 이러한 예시로는 Rust, C#, Scala와 같은 언어들이 있다.

  • sequence matching: 주어진 일련의 토큰들에서 구문의 위치를 파악하는 것이다. (e.g. where is the first "a" in "pattern_matching"?)
  • tree matching: 주어진 일련의 토큰의 구조에서 구문이 어떤 토큰에 포함되어 있는지를 파악하는 것이다. (e.g. what type of Nation(Korea)?)

예시

expr match {
    case variant_id_1(field_id_11, ... ) => expr1
    case variant_id_2(field_id_22, ... ) => expr2
}

이를 좀더 구체적인 예로 생각해 보자면,

shape match {
    case Triangle(a, b, c)=> a + b + c
    case Rectangle(h, w) => 2 * (h + w)
    _ => todo!()
}

와 같이 shape의 타입을 판단하여 다른 결과를 가져오는 match패턴을 생각할 수 있다.

If-else / switch문과의 차이점

If-else와 같은 문들은 컴파일러가 파악할 수 없다. 이에 반해, matching구분은 컴파일러가 매칭이 모두 이루워 지고 있는지, default는 선언되었는지, 타입이 일치하는지와 같은 semantic오류를 미리 파악할 수 있다. 따라서, matching은 if-else 혹은 switch보다 error prone하지 않다고 할 수 있다.