대수 데이터 유형을 사용하여 하스켈에서 트리 또는 목록을 표현하는 것은 쉽습니다. 하지만 그래프를 활자체로 표현하려면 어떻게해야할까요? 포인터가 필요한 것 같습니다. 나는 당신이 다음과 같은 것을 가질 수 있다고 생각합니다.
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
그리고 그것은 실행 가능할 것입니다. 그러나 그것은 약간 분리 된 느낌입니다. 구조의 다른 노드 사이의 링크는 목록의 현재 이전 요소와 다음 요소 또는 트리의 노드의 부모와 자식 사이의 링크만큼 견고하게 느껴지지 않습니다. 정의한대로 그래프에서 대수적 조작을 수행하는 것은 태그 시스템을 통해 도입 된 간접 수준에 의해 다소 방해를받을 것이라는 예감이 있습니다.
내가이 질문을하게 만드는 것은 주로이 의심의 느낌과 우아함에 대한 인식 때문입니다. Haskell에서 그래프를 정의하는 더 나은 / 더 수학적으로 우아한 방법이 있습니까? 아니면 본질적으로 어렵거나 근본적인 무언가를 우연히 발견 했습니까? 재귀 적 데이터 구조는 훌륭하지만 이것은 다른 것 같습니다. 트리 및 목록이 자체 참조되는 방식과는 다른 의미의 자체 참조 데이터 구조입니다. 목록과 트리는 유형 수준에서 자체 참조와 비슷하지만 그래프는 값 수준에서 자체 참조입니다.
그래서 무슨 일이 일어나고 있습니까?
fgl
으로부터 개발 된 패키지.