【发布时间】:2013-09-26 23:00:32
【问题描述】:
我想创建一个图形结构,它也可以用来表示更高级别的图形。我认为这个问题最好通过一个图来表达:
您可能已经注意到,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 图形之间的连接将是
M.Map (Int, Int) Connection类型,因此图形的边应该是M.Map (Int, Int) (M.Map (Int, Int) Connection)类型。这意味着 1 级图中的每条边都会返回 0 级图的内部节点之间的一组连接。 - 同样,对于第 n 级图,连接类型应为
M.Map (Int, Int) <Type of connection for Level n-1 graph>。
编辑:其实上面的表述对我有用;我只需要以简化的形式存储边缘。但是有没有可能写出满足上述条件的程序呢?
【问题讨论】:
标签: java c#-4.0 haskell language-agnostic static-typing