其他一些人已經簡要地提到了fgl
和Martin Erwig的Inductive Graphs and Functional Graph Algorithms,但它可能值得寫出一個實際上給出感應表示方法背後的數據類型的意義的答案。
在他的論文,Erwig提出了以下幾種類型:
type Node = Int
type Adj b = [(b, Node)]
type Context a b = (Adj b, Node, a, Adj b)
data Graph a b = Empty | Context a b & Graph a b
(在fgl
的表現略有不同,並充分利用類型類 - 但這個想法基本上是相同的。)
Erwig描述了一個多圖,其中節點和邊有標籤,並且所有邊都是直接指向的。 A Node
有某種類型的標籤a
;邊緣有某種類型的標籤b
。 A Context
簡單地(1)標記邊緣的列表,其指向到特定節點,(2)所討論的節點,(3)節點的標籤,以及(4)標記邊緣的列表,指向,從節點。然後可以將Graph
作爲Empty
或作爲Context
合併(與&
)歸納爲現有Graph
。
由於Erwig指出,我們不能隨意生成Graph
與Empty
和&
,因爲我們可能會產生與Cons
和Nil
構造,或Leaf
和Branch
一個Tree
列表。太不像列表(正如其他人所提到的),不會有任何規範的Graph
表示。這些是至關重要的差異
然而,是什麼讓這表示如此強大,所以類似的列表和樹的典型哈斯克爾表示,是這裏的Graph
數據類型是歸納定義。事實上,列表是歸納定義的,它允許我們在它上簡潔地匹配模式匹配,處理單個元素,並遞歸處理列表的其餘部分;同樣,Erwig的歸納表示允許我們一次遞歸地處理一個圖形Context
。這種圖形表示方式適用於在圖形上繪製圖形的簡單定義(gmap
),以及在圖形上執行無序摺疊的方法(ufold
)。
此頁面上的其他評論很棒。然而,我寫這個答案的主要原因是,當我讀到諸如「圖不是代數的」這樣的短語時,我擔心有些讀者不可避免地會忘記沒有人找到表示圖表的好方法的(錯誤的)印象在Haskell中允許對它們進行模式匹配,對它們進行映射,對它們進行摺疊,或者通常做一些我們習慣使用列表和樹的很酷,功能性的東西。
您可能會感興趣Martin Erwig關於函數圖算法的論文:http://web.engr.oregonstate.edu/~erwig/papers/abstracts.html#JFP01。這個'fgl'包被開發出來了。 – 2012-03-16 08:39:41