F# active patterns

F# 패턴 매칭에서 엑티브 패턴(active patterns)이라 불리는 좀 특별한 형태가 존재하는데 처음 공부할 때 대충 공부해서 오늘 날잡고 좀 들여다 보면서 정리해보려고 한다.

일단 “““제대로””” 공부하기전에 전에 대충 공부하고 이해한 엑티브 패턴은 동적으로 패턴을 찾는거라고 이해했었는데 맞는지 한번 자세히 들여다 보자.

일단 F# 뉴스레터에서 추천했던 다음 동영상부터 감상을 하자 (아래 이미지 클릭시 재생) Youtube

해당 동영상의 소스와 프리젠테이션은 아래 링크에 공개되어있다 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/

comments powered by Disqus