使用代数数据类型在 Haskell 中表示树或列表很容易。但是如何通过排版来表示图形呢?似乎你需要使用指针。我猜你可以这样做:
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
这种方式是可行的,但感觉有点解耦;结构中不同节点之间的链接没有像列表中当前、前一个和后一个元素之间或树型结构中节点的父子之间那样紧密。我有一种直觉,通过我定义的标签系统对图进行代数操作可能会受到引入级别的间接性的阻碍。
主要是这种疑虑和感觉不够优雅,促使我提出这个问题。在Haskell中是否有更好/更数学优雅的定义图的方式?还是我碰到了什么困难/根本性的问题?递归数据结构很棒,但这似乎是另一回事。它与树和列表的自我引用不同。就像列表和树在类型层面上是自我引用的,而图在值层面上是自我引用的。
那么,到底发生了什么?
fgl
软件包是由此开发而来的。 - John L