나는 Haskell에 작성된 Elm 컴파일러를 둘러 보았다.하스켈에서 AST의 보편적 인 주석이 있습니까?
나는 그것을위한 몇 가지 최적화를 구현하기 시작하고 싶습니다,이 부분 등의 AST를 순회하며 꼬리 전화와 같은 특정 노드에 "주석"을 추가 포함
내가 사용할 수 있습니다 알고 SYB 또는 uniplate를 사용하여 순회를 수행하지만, 유형을 처리 할 수있는 상용구없는 방법이 있는지 궁금합니다.
data AnnotatedExpr = PlusExpr Expr Expr [Annotation] ...
data AnnotatedDef = TypeAlias String [String] Type [Annotation] ...
이것은 : 나는 상용구를 작성한다면
data Expr = PlusExpr Expr Expr ...
data Def = TypeAlias String [String] Type ...
, 나는이 같은 새로운 유형을 만들어 주겠다고 : 그래서
, 우리는 우리의 AST에 대한 대수 종류의 무리가 있다고 가정 쓸만한 많은 표식, 그리고 이것을 피하는 것이 좋은 습관처럼 보입니다.
나는 이런 식으로 뭔가를 작성할 수
Data AnnotationTree = Leaf [Annotation]
| Internal [AnnotationTree] [Annotation]
그럼 난 그냥 AST에 주석 트리 실행 평행이있을 것이다. 그러나이 나무들이 같은 구조를 가질 것이라는 보장은 없으므로 유형 안전을 잃습니다.
그렇다면 정형을 피할 수 있지만 형식이 안전한 방식으로 트리에 주석을 달아주는 세련된/권장 솔루션이 있습니까? 각 노드를 동등한 노드로 바꾸고 나중에 컴파일 할 때 사용되는 주석 목록을 바꾸려면?
이 접근 방식은 단일 'Expr'유형 대신에 상호 유도 형을 많이 포함하는 상황에 어떻게 일반화됩니까? 'Expr'은'Pat's을 포함하는'case' 구조를 가지고 있다고 가정합니다. 그러나 그것들 중 일부는'Expr'을 포함하는 뷰 패턴이 될 수 있습니까? – Cactus
'데이터 위브 f g = 위브 (g (위브 g f) (위브 f g))', https://gist.github.com/tel/29eb767c7cb331104537과 같은 것으로 조금 더 확장 할 수 있습니다. 일반적으로, * Initial Algebra Semantics가 충분하다는 것을 조사하는 것이 필요하다고 생각합니다. *, 그러나 나는 아직 이해하지 못합니다. –
불행히도 이러한 접근 방식은 주석을 달 때 작동하지 않습니다. bialgebra'f a -> a '는'Weave' recursors에서'Weave'를 만들기에는 너무 제한적입니다. –