我想创建一个图形结构,它也可以用来表示更高级别的图形。我认为这个问题最好通过一个图来表达:
您可能已经注意到,级别图n-1
包含级别节点n
。没有混合图,即图中的所有节点都具有相同的级别。
我的用例的另一个方面是节点基本上只是一个函数。因此,1 级图是功能的互连(想想神经网络)。
我还需要图的连接矩阵是一个独立的对象而不是节点的属性(即我需要一些对象来表示所有连接,而不是Node.Next
作为每个节点上的属性)。
我想到的一种伪代码方法是:
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 级图之间的连接将是 type
M.Map (Int, Int) Connection
,因此图的边应该是 typeM.Map (Int, Int) (M.Map (Int, Int) Connection)
。这意味着 1 级图中的每条边都会返回 0 级图的内部节点之间的一组连接。 - 同样,对于 n 级图,连接的类型应该是
M.Map (Int, Int) <Type of connection for Level n-1 graph>
。
编辑:实际上上述表示可以为我工作;我只需要以简化的形式存储边缘。但是有没有可能写出满足上述条件的程序呢?