파라메트릭 합성 데이터 타입

파라메트릭 합성 데이터 타입

초록

본 논문은 기존의 합성 데이터 타입(CDT) 프레임워크에 변수 바인더를 자연스럽게 다루기 위해 파라메트릭 고차 추상 구문(PhOAS)을 결합한다. Functor에서 Difunctor로 일반화함으로써 모듈성은 유지하면서 exotic term 문제를 타입 수준에서 차단한다. 이를 통해 상수 접기와 같은 변환을 안전하게 수행할 수 있다.

상세 분석

합성 데이터 타입(CDT)은 Swierstra의 “data types à la carte” 아이디어를 Haskell 라이브러리 형태로 구현한 것으로, 서로 독립적인 시그니처를 조합해 재귀형 AST를 정의하고, 함수도 모듈식으로 확장할 수 있게 해준다. 그러나 기존 CDT는 변수 바인딩을 표현할 메커니즘이 부족했으며, 이를 보완하려면 전통적인 이름 기반 바인딩이나 HOAS를 직접 구현해야 했는데, 이는 exotic term(예상치 못한 비정상적 형태의 term) 발생 위험을 내포한다.

Chlipala가 제안한 파라메트릭 HOAS(PHOAS)는 바인더를 Haskell의 함수 타입에 매핑함으로써 바인딩·대입을 메타레벨에서 자동으로 처리한다. PHOAS의 핵심은 바인더 변수에 대한 타입 파라미터를 도입해 “모든 변수는 외부에서 제공된 타입에 의해 고정된다”는 제약을 두는 것이다. 이 접근법은 exotic term을 타입 시스템이 차단하도록 만들지만, 기존 CDT와 직접 결합하기엔 Functor 기반 설계가 제한적이다.

논문은 Functor를 Difunctor(두 개의 타입 매개변수를 갖는 범주적 구조)로 일반화한다. Difunctor는 입력(바인딩된 변수)과 출력(결과값) 타입을 독립적으로 변형할 수 있어 PHOAS의 파라메트릭 변수와 자연스럽게 맞물린다. 구체적으로, 각 시그니처는 type Sig a b = ... 형태의 Difunctor 인스턴스를 제공하고, 재귀 구조는 Term f a = In (f a (Term f a))와 같이 정의된다. 여기서 a는 바인딩된 변수의 타입 파라미터, b는 재귀적 하위 트리 타입이다.

이 설계는 기존 CDT의 모듈성(시그니처를 자유롭게 합성하고, 함수도 foldcata 같은 재귀 스킴을 이용해 정의)과 PHOAS의 안전성을 동시에 제공한다. exotic term은 forall a. Term f a 형태의 전역 다형성을 통해 컴파일 타임에 차단되며, 별도의 추상 타입을 도입할 필요가 없어진다. 또한, 바인더를 함수로 표현하므로 α-변환이 자동으로 보장되고, 변수 캡처 문제도 사라진다.

구현 측면에서는 Data.Functor.Foldablecatapara를 Difunctor 버전으로 재정의하고, ApplicativeMonad 인스턴스를 통해 효과ful 연산(예: 상태 유지, 오류 전파)을 삽입한다. 논문은 상수 접기(constant folding) 예제를 통해 변환 함수가 재귀적으로 생성된 CDTs를 직접 검사하면서도 타입 안전성을 유지함을 시연한다. 기존 HOAS 기반 구현에서는 exotic term이 섞여 변환이 불안정했지만, 제안된 프레임워크는 그런 위험 없이 동일한 최적화를 수행한다.

결론적으로, Functor→Difunctor 일반화는 PHOAS와 CDT의 장점을 결합한 새로운 설계 패턴을 제시한다. 이는 언어 구현, DSL 설계, 그리고 복잡한 바인딩 구조를 갖는 프로그램 변환에 있어 모듈성과 안전성을 동시에 요구하는 상황에 매우 유용하다.