编辑纯功能图

Phi*_*sky 2 haskell editing graph purely-functional

假设有一个图表和一些功能集如下:

create-node :: Graph -> (Graph, Node)
split-node :: Graph -> Node -> (Graph, Node, Node)
Run Code Online (Sandbox Code Playgroud)

我想创建那些不期望Graph作为参数的函数的版本,主要是为了方便(最好不要使用monad,所以我不需要在monad块中包装每个图形操作代码片段).那么这个怎么样:

create-node :: (Graph -> (Graph, Node))
split-node :: (Graph -> Node) -> ((Graph -> Node), (Graph -> Node))
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

fun :: (Graph -> Argument) -> ... -> (Graph -> Result)
Run Code Online (Sandbox Code Playgroud)

然后我就可以使用这些(Graph -> ...)值,就好像它们是普通节点一样.最后,要从(Graph -> ...)值中获取实际图形,只需将其应用于空图形.这是一种合理的方法吗?

ram*_*ion 5

好的,所以

create-node :: (Graph -> (Graph, Node))
Run Code Online (Sandbox Code Playgroud)

状态monad,只是没有花哨的newtype(和翻转的返回值).所以我没有看到不使用State这里的优势.毕竟,让我使用状态Monad编写相当干净的代码:

 reverseEdgesM :: State Graph ()
 reverseEdgesM = do --...
Run Code Online (Sandbox Code Playgroud)

每当我有一些纯粹的代码runState和朋友一起运行时,就会弹出它:

 reverseEdges :: Graph -> Graph
 reverseEdges = execState reverseEdgesM
Run Code Online (Sandbox Code Playgroud)

如果您确实想要推进您的功能想法,您可能需要查看差异列表,以了解它是如何使用简单列表完成的.

此外,如果您只是要实现一些算法,您可能需要查看现有的功能图数据结构库(如fgl),而不是自己编写.如果你想理解这个理论,请查看Erwig关于归纳图的论文.