F# 패턴 매칭에서 엑티브 패턴(active patterns)이라 불리는 좀 특별한 형태가 존재하는데 처음 공부할 때 대충 공부해서 오늘 날잡고 좀 들여다 보면서 정리해보려고 한다.
일단 “““제대로””” 공부하기전에 전에 대충 공부하고 이해한 엑티브 패턴은 동적으로 패턴을 찾는거라고 이해했었는데 맞는지 한번 자세히 들여다 보자.
일단 F# 뉴스레터에서 추천했던 다음 동영상부터 감상을 하자 (아래 이미지 클릭시 재생)
해당 동영상의 소스와 프리젠테이션은 아래 링크에 공개되어있다 https://github.com/pblasucci/DeepDive_ActivePatterns
동영상 요약
F#의 패턴 매칭에는 한계(limitation)가 있다. F#이 CLR위에서 동작하고 CLR을 만들때는 Functional language에 대한 염두가 없었기 때문이다.
컴파일러에게 친숙한 패턴 16개
- Constant pattern
- Null pattern
- Identifier pattern
- Tuple pattern
- Record pattern
- Cons pattern
- List pattern
- Array pattern
- Variable pattern
- Pattern together with type annotation
- Type test pattern
- ‘as’ pattern
- EITHER pattern
- BOTH pattern
- Parenthesized pattern
- Wildcard pattern
- Active Pattern Paper at ICFP 2007
2007년 Don Syme이 ICFP에서 Active Pattern 논문을 발표했다. 다음은 일부를 발최한 내용이다.
An active pattern is a pattern defined without reference to a discriminated union type declaration. At a basic level an active pattern is just a regular function, but it is defined using a new syntactic element called a structured name which gives it special significance in the language… The regular [structured] name [more correctly, its constituent names] will also be added to the environment of patterns, enabling it to be used in patterns where it is in scope. Previously the only way of adding a new pattern was by defining a new union type… Active patterns can be used in any pattern expression, can be defined to operate on any type, and can be checked statically for completeness and redundancy of a match.
요약하면, 컴파일러가 패턴 매칭을 만나면 if, select등의 기본적인 문장으로 바꾸는데 active pattern을 사용하면 개발자가 이 프로세스를 확장하여 컴파일러가 좀 더 똑똑하게 동작하게 만들수 있음.
Active Pattern 종류
- Single case Total Patterns
- Multi-case Total Patterns
- Partial Patterns
- Parameterized Patterns
- First-class Patterns
Reference
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/active-patterns https://www.devjoy.com/series/f-sharp-active-patterns/ https://fsharpforfunandprofit.com/posts/convenience-active-patterns/