我想在haskell中創建一個DAG,但由於我是新手,對於整個函數式編程而言,我希望有一些方向。用haskell在列表和集合中創建一個有向無環圖
圖表需要與僅列表和集合來構建,並且以下功能必須實現:
V = add_vertex(G,W)
一個頂點與指定的權重w被加到DAG g及其唯一的頂點標識符v被返回。
的add_edge(G,A,B,W)
從與頂點標識符的頂點到頂點的標識符b中的頂點的邊被添加到DAG克與重量瓦特
什麼我目前做的是創造它看起來像這樣一種數據類型:
data Graph v w = Graph {vertices :: [(v, w)],
edges :: [([(v, w)], [(v, w)], w)]} deriving Show
而且我想我需要某種形式的構造函數圖形的,它看起來像這樣:
create_graph :: (v,w) -> w -> Graph v w
create_graph v w = Graph [v] [(v, v, w)]
我想要做的只是創建一個空圖,但現在我需要輸入一些起始值,如果我理解正確。我該如何解決這個問題?
的add_vertex功能如下:
add_vertex :: Graph v w -> (v, w) -> Graph v w
add_vertex (Graph v w) x = Graph (v ++ [x]) w
但我真的不知道怎麼回事頂點標識,而不是整個圖表。我想我也應該指定標識符需要是一個字符,權重可以是浮點數或整數,我該怎麼做?
我也想有拓撲排序的功能和獲得最長路徑的權重。考慮到這一點,我應該以不同的方式定義圖的結構嗎?
感謝
1)你的圖形數據類型只存儲頂點,但你的「圖形構造函數」也試圖存儲邊緣。 2)你的add_vertex實現非常單一。你應該使用:而不是++。可能你應該從較簡單的練習開始。 – user3974391
是的,這是構造函數的問題。我只想做一個空的圖,不插入任何頂點或邊,是可行的嗎?將考慮從++更改爲:,謝謝指出。那麼這是我們第一次在學校獲得的優秀成績,我正在努力閱讀「儘可能地學習你一個哈斯克爾」。 – hboy
空圖只會是'emptyGraph = Graph [] []'。在你的數據類型中,我不明白爲什麼每條邊都有兩個頂點列表;並假設'w'是權重的類型參數,爲什麼頂點的權重在邊緣重複。 – kosmikus