2013-11-04 101 views
0

下面我給出了列表和樹的數據構造函數。如何聲明圖的數據構造函數

data List a = NilL | Cons a (List a) deriving Show 
data Tree a = NilT | Branch a [Tree a] deriving Show 

利用這些定義我可以輕鬆地創建無限結構,如下所示:

list = Cons 1 list 
tree = Branch 1 lt 
where 
    lt = tree : lt 

我想創建以這種方式無限的曲線圖(包括定向和非定向)。如何爲它聲明數據構造函數以及如何使用Haskell中的數據構造函數創建無限圖?

+0

您可能還喜歡[「您如何在Haskell中表示圖形?」](http://stackoverflow.com/q/9732084/791604)。 –

回答

1

一個簡單的解決方案是使用某種形式的間接的,如指數

type Vertex = Integer 
data Graph = Graph [Vertex] [(Vertex, Vertex)] 

infGraph = Graph [1..] [(a, b) | a <- [1..], b <- [1..]] 

然而,這並不像打結

data Vertex = Vertex { tag :: Integer 
        , edges :: [Vertex] } 

type Graph = [Vertex] -- A graph is determined by the set of vertices 

-- Construct a graph of infinitely many vertices in which 
-- each vertex is connected. 
infGraph = map (flip Vertex infGraph) [1..] 
infGraph' = map (\v' -> v' infGraph') . map Vertex $ [1..] 

我們mapVertex[1..]這給了我們爲滿足函數列表[Vertex] -> Vertex,它們需要一列邊來連接每個頂點。由於infGraph是所有頂點的列表,我們將其傳遞給每個Vertex並打結。

當然對於認真的工作,請使用package

+0

在第二個例子中,你給了'type Graph = [Vertex]',我不明白你是如何從這件事物中獲得優勢的?請解釋一下。 –

+0

@TemPora看看頂點的定義,邊被嵌入頂點。 – jozefg

+0

謝謝。我已經看到了它的先前定義。弄糊塗了Integer如何處理所有這些事情。抱歉。 –

相關問題