Conor McBride的某些作品《Diff,Dissect》将数据类型的派生与它们的“单孔上下文类型”相关联。也就是说,如果采用该类型的派生形式,则将剩下一个数据类型,该数据类型向您显示该数据类型在任何给定点从内部看起来如何。
因此,例如,如果您有一个列表(在Haskell中)
data List a = [] | a : List a
这对应于
data List a = 1 + a * List a
通过一点数学魔术,导数是
data ListDeriv a = List a * List a
这被解释为意味着在列表中的任何一点处,左侧都会有一个列表,而右侧则有一个列表。我们可以使用派生数据结构浏览原始列表。
现在,我有兴趣对图形进行类似的操作。图的常见表示形式是一组顶点和边,它们可以通过以下数据类型来简单地实现:
data Gr a b i = Gr [(i,a)] [(i,i,b)]
如果我正确理解的话,就图索引而言,这种数据类型的派生i
应该是类似的。
data GrDeriv a b i = d/di (Gr a b i)
= d\di ( [a*i] * [b*i^2] )
= (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
= (a* [a*i] * [a*i]) * [b*i^2] )
+ [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
= InNodes { nodesLeft :: [(a,i)]
, nodeLbl :: a
, nodesRight :: [(a,i)]
, edges :: [(b,i,i)] }
| InEdges { nodes :: [(a,i)]
, adjNode :: Either (b,i) (b,i)
, edgesLeft :: [(b,i,i)]
, edgesRight :: [(b,i,i)] }
我是通过将乘积规则和链规则用于派生而得到的,尽管可能会有一些错误,但它似乎遵循了一般的方案。在此结构中,您将专注于Nodes(InNodes构造函数)或Edges(在edges中),并在指定的位置看到相关的数据。
但这不是我想要的。我希望找到一种与Martin Erwigs功能图库的接口更紧密相关的构造。具体来说,我想在一个节点上看到一个表示该节点标签的上下文和两个邻接表,一个邻接表,一个邻接表。
Node a b = ([(i,b)],a,[(i,b)])
但是,我确实看到了希望,因为邻接表示法a
在每个孔位置与每个边缘的邻接表示法/分解法与派生词,孤标都有一些共同点。
由于派生函数与原始函数不相同,但是派生函数的集成是(kindof),是否存在某种集成类似物可将派生函数转换为节点上下文的集合?请注意,这不是直接集成来恢复原始结构,而是一种与原始结构等效的结构,但具有更友好的算法表示形式。
如果有的话,我希望可以通过一些简单的“一组顶点和边”语言来指定关系类型结构,并且我可以派生一个高效的库来处理该结构。这样的实现方式可以用于研究“超越图论”的结构:超图,单纯形复...
所以。这个想法似乎可行吗?有用?有没有关于这种事情的研究,我可以阅读更多?
附录
我敢肯定,这可以表示为(类别理论?)
要么
我确实认为这显示了一些希望,但我缺乏进一步发展的技巧。我知道那里必须进行进一步的探索。
*如果链接断开,请引用:Rhee,Injong等。“ DRAND:用于无线自组织网络的分布式随机TDMA调度。” IEEE Transactions on Mobile Computing 8.10(2009):1384-1396。