2012-09-20 2 views
1

하스켈에서 AST를 구현하고 싶습니다. 기능적 데이터 구조를 사용하는 것이 불가능한 것처럼 상위 참조가 필요합니다. article에서 다음을 본 적이 있습니다. 노드를 다음과 같이 정의합니다.Haskell에 부모가있는 구문 트리

type Tree = Node -> Node 

노드는 Key 유형의 키로 속성을 가져올 수 있습니다. 그런 패턴에 대해 읽을만한 것이 있습니까? 더 많은 링크를 주시겠습니까?

+3

Zippers를 살펴보십시오. – Squidly

+0

그리고 여기는 좋은 [link] (http://learnyouahaskell.com/zippers)입니다. –

+0

또한 ekmett의 [lens] (http://hackage.haskell.org/package/lens) 라이브러리를주의 깊게 살펴보십시오. 그는 lib에 통합 된 렌즈 기반 지퍼 구현 작업을하고 있습니다. 다음 릴리스에 대해 (나는 생각한다). – jberryman

답변

2

주기적 자체 참조가있는 순수한 데이터 구조를 원할 경우 delnan은 설명에서 the usual term for that is "tying the knot"으로 말합니다. 해당 용어를 검색하면 더 많은 정보를 얻을 수 있습니다.

매듭을 묶어서 만든 데이터 구조는 일반적인 방식으로 "업데이트"하기가 어렵거나 불가능하다는 점에 유의하십시오. 비순환 구조를 사용하면 새로운 구조를 만들 때 원래 구조를 유지할 수 있습니다. 하지만주기의 모든 부분을 변경하려면 전체주기를 다시 작성해야합니다. 당신이하는 일에 따라, 이것은 물론 문제 일 수도 있고 아닐 수도 있습니다.

+0

그건 내가 원한거야! 감사! –

+3

@ ConstantinSolomatov : 일부 표준 라이브러리의 소스를 탐색하는 것이 재미있을 수도 있습니다. 'repeat x = xs where xs = x : xs'와 같은 함수는 매듭을 묶는 방식으로 정의되므로'repeat '를 사용하면 자체 꼬리 인 "head"요소가있는 목록이 만들어집니다. 순진한'repeat x = x : repeat x'는 그렇게하지 않을 것입니다. –

관련 문제