부 프로젝트의 경우 현재 추상적 인 구문 트리를 처리하고 규칙에 따라 변환해야합니다 (세부 사항은 중요하지 않음).복잡한 AST에서 재귀 분석하기
AST 자체는 중요하지 않으며 일부 형식으로 만 제한된 하위 표현식이 있음을 의미합니다. . (예를 들어, 운영자 A
는 유형 B
의 인 인수되지 않은 Expr
를 취해야합니다 내 데이터 타입의 대폭 단순화 감소 버전은 다음과 같습니다
data Expr = List [Expr]
| Strange Str
| Literal Lit
data Str = A Expr
| B Expr
| C Lit
| D String
| E [Expr]
data Lit = Int Int
| String String
내 목표는 명시 적으로 재귀을 고려하고 의지하는 것입니다 . 내가하지 않았다면
data ExprF a = List [a]
| Strange (StrF a)
| Literal (LitF a)
data StrF a = A a
| B a
| C (LitF a)
| D String
| E [a]
data LitF a = Int Int
| String String
: 내 AST에 필요한 인수 분해를 적용 작동하는 매우 강력한 범용 도구를 제공 thesetwo 우수 블로그 게시물에서 입증 된 바와 같이 재귀 방식 대신, 우리와 끝까지 엉망진창, type Expr = Fix ExprF
은 이전에 정의 된 Expr
과 동형이어야합니다. 내가 잘 입력해야 cata
에 대한 Str :: ExprF a
의 내부에 패턴 일치 B a :: StrF a
에 가지고
그러나, 이러한 경우에 cata
를 작성하는 것은, 오히려 지루한된다. 원래의 AST 전체에 대해 이것은 실현 불가능합니다.
나는 그것이 내 문제에 대한 해결책 인 것처럼 보였지만, 중복 된 고차 유형 클래스 등의 사용자 친화적이지 않은 인터페이스는 매우 불필요한 보편적 인 것인데 나는 fixing GADTs을 발견했습니다.
그래서, 내 질문을 요약합니다 :
- 는 GADT로 AST 이것에 대해 갈 수있는 올바른 방법을 재 작성되어 있습니까?
- 그렇다면 예제를 어떻게 잘 작동하는 버전으로 변환 할 수 있습니까? 두 번째 메모에서 GHC에 더 높은 종류의
Functor
을 더 잘 지원합니까?