簡體   English   中英

在Haskell中保存圖形

[英]Saving graphs in Haskell

我可以輕松地為有向圖的節點定義數據類型。

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

我可以使用show函數將圖形保存到文件中,然后使用read恢復它。 但是,節目不會應付一個周期。 是否有一種保存和恢復圖形的簡單方法?

不是我所知道的。 你必須編寫一個圖遍歷函數。

首先,決定在哪里打破循環。 在這種情況下,它是微不足道的:使用節點名稱(假設它們在圖形中是唯一的)。 對於更復雜的結構,例如將節點和邊作為單獨類型的圖,您必須決定是否存儲具有節點的邊,具有邊的節點,還是保持節點和邊完全分離。

然后枚舉圖中的所有節點。 在這種情況下,顯而易見的方法是遍歷有限映射中的圖形采集節點(參見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

注意相互遞歸:table調用makeNode,它調用findNode,調用table。 感謝懶惰的評價,這就是正確的事情

編輯:代碼現已測試並略有擴展。

是的,不是。 它可以通過您對Node類型結構的領域知識來完成,並定義一些您可以測試的相等概念,並結合目前為止看到的節點列表或映射來恢復共享。 在病理學案例中,GHC中存在StableName的概念來構建這樣的概念。

在另一個方面,馬特莫羅已經做了一些工作,以匯編語言.S文件的形式提取,使用他方便的真空庫任意循環數據。 所以無論是真空還是真空都可能滿足您的需求

通常,避免伏都教和跟蹤到目前為止在地圖中看到的節點可能是最合理和可維護的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM