문제

지시 된 그래프의 노드에 대한 데이터 유형을 쉽게 정의 할 수 있습니다.

data Node = Node String [Node] derving (Show, Read)

Show 함수를 사용하여 그래프를 파일에 저장 한 다음 읽기를 사용하여 복원 할 수 있습니다. 그러나 쇼는주기에 대처하지 않습니다. 그래프를 저장하고 복원하는 사소한 방법이 있습니까?

도움이 되었습니까?

해결책

내가 아는 한 멀지 않습니다. 그래프 트레이닝 기능을 작성해야합니다.

먼저, 원형을 깨는 곳을 결정하십시오. 이 경우 사소한 것입니다. 노드 이름을 사용하십시오 (그래프 내에서 고유하다고 가정). 노드와 모서리가있는 그래프와 같은보다 복잡한 구조를 위해서는 노드, 모서리가있는 노드 또는 노드와 가장자리를 완전히 분리하여 저장할 것인지 결정해야합니다.

그런 다음 그래프의 모든 노드를 열거하십시오. 이 경우 명백한 방법은 유한 맵에서 그래프 수집 노드를 가로 지르는 것입니다 ( data.map). 그런 다음 각 노드를 이름으로 저장 한 다음 다른 노드 이름 목록을 저장하십시오.

그래프를 복구한다는 것은 "매듭 묶음"패턴을 사용하여 의미합니다. 저장된 그래프를 [(string, [string])의 구조로 읽으십시오. 그런 다음 원본 그래프를 다음 코드로 재구성 할 수 있습니다.

import qualified Data.Map as M

data Node = Node String [Node]

instance Show Node where
   show (Node name others) = "Node " ++ show name ++ 
         " " ++ show (map nodeName others)
      where nodeName (Node n _) = n

restoreGraph :: [(String, [String])] -> M.Map String Node
restoreGraph pairs = table
   where
      table = M.fromList $ map makeNode pairs
      makeNode (name, others) = (name, Node name $ map findNode others)
      findNode str = fromJust $ M.lookup str table

상호 재귀 참고 : 테이블은 Makenode를 호출하여 FindNode를 호출합니다. 게으른 평가 덕분에 이것은 옳은 일을합니다.

편집하다: 코드는 이제 테스트되고 약간 확장되었습니다.

다른 팁

예 그리고 아니오. 노드 유형의 구조에 대한 도메인 지식과 공유를 복구하기 위해 지금까지 보이는 노드의 목록 또는 맵과 결합하여 테스트 할 수있는 평등 개념을 정의하여 수행 할 수 있습니다. 병리학 적 경우에는 그러한 개념을 구성하기 위해 GHC의 안정화 개념이 있습니다.

다른 전면에서 Matt Morrow는 편리한 진공 라이브러리를 사용하여 어셈블리 언어 .S 파일, 임의의 순환 데이터 형태로 추출하기 위해 약간의 작업을 수행하고 있습니다. 따라서 그 또는 진공 청소기는 귀하의 요구에 맞을 수 있습니다.

일반적으로 Voodoo를 피하고 지금까지지도에서 볼 수있는 노드를 추적하는 것이 아마도 가장 합리적이고 유지 가능한 솔루션 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top