我想創建一個圖表結構,它也可以用來表示更高級別的圖表。我認爲這個問題是通過人物的最佳表現: 如何創建遞歸類型圖(圖的圖)?
正如你可能已經注意到,n-1
級別的圖形中包含n
等級的節點。沒有混合圖,即圖中的所有節點具有相同的級別。
我的用例的另一個方面是節點基本上只是一個函數。所以1級圖形是功能的互連(想想神經網絡)。我還需要圖的連接矩陣是一個獨立的對象,而不是節點的屬性(即我需要一些對象來表示所有連接,而不是每個節點上的屬性Node.Next
)。
一個psedocode的方法,我已經記:
class Node<T>:
func :: T -> T //The function 'func' takes a value of type 'T' and returns another value of type 'T'.
class Network<T where T is instance of Node> inherits Node<T2>:
ConnectionMatrix<T> matrix;
override/implement func :: T2 -> T2;
//I'm applying some sort of pattern matching on types here:
type ConnectionMatrix<Network<T>> =
Dictionary<Nerwork<T>, Dictionary<Nerwork<T>, ConnectionMatrix<T>>>
type ConnectionMatrix<Node> = Dictionary<Node, Dictionary<Node, Integer>>
但是,正如你可以看到它是不完整的,因爲它的立場不能在我知道的任何語言來表示。
只要不是動態輸入,實現的語言就不應該成爲問題。
編輯: 以下解決方案(如在回答中所建議的)將不會受到我的設計工作:
data Connection = Connection {
weight :: Double,
length :: Int
} deriving (Eq, Show)
data Graph a = Graph {
nodes :: M.Map Int a,
edges :: M.Map (Int, Int) Connection
} deriving (Eq, Show)
data Network a = Simple a | Nested (Network (Graph a))
deriving (Eq, Show)
的原因是,我需要一個加權圖這樣的:
- 兩個0級圖(即簡單節點)之間的連接與上面定義的
Connection
類型相同。 - 兩個1級圖形之間的連接將是
M.Map (Int, Int) Connection
類型,因此圖形的邊緣應該是M.Map (Int, Int) (M.Map (Int, Int) Connection)
類型。這意味着級別1圖形中的每條邊都會返回級別0圖形的內部節點之間的一組連接。 - 同樣,對於Level n圖,連接類型應爲
M.Map (Int, Int) <Type of connection for Level n-1 graph>
。
編輯:其實上述表示法可以爲我工作;我只需要以縮小的形式存儲邊緣。但是有可能編寫一個程序來滿足上述條件嗎?
嘿,我剛剛編輯我的問題,給出這個解決方案不起作用的原因。但是,我必須說,我對網絡類型的簡潔性感到驚訝。我花了3個小時才弄清楚究竟發生了什麼(我對Haskell的Map和Set數據類型缺乏瞭解並沒有幫助)。 – Likhit