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 -> ...)值中获取实际图形,只需将其应用于空图形.这是一种合理的方法吗?
好的,所以
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关于归纳图的论文.