2

假设有一个图表和一些函数集,例如:

create-node :: Graph -> (Graph, Node)
split-node :: Graph -> Node -> (Graph, Node, Node)

我想创建不期望Graph作为参数的那些函数的版本,主要是为了方便(最好没有单子,所以我不需要将每个图形操作代码块包装在单子块中)。那么这个呢:

create-node :: (Graph -> (Graph, Node))
split-node :: (Graph -> Node) -> ((Graph -> Node), (Graph -> Node))

或更一般地说:

fun :: (Graph -> Argument) -> ... -> (Graph -> Result)

然后我就可以像使用(Graph -> ...)普通节点一样使用这些值。最后,要从一个值中得到一个真实的图形(Graph -> ...),只需将它应用于一个空图形。这是一个合理的方法吗?

4

1 回答 1

5

好的,所以

create-node :: (Graph -> (Graph, Node))

状态单子,只是没有花哨的新类型(和翻转的返回值)。所以我看不到不在State这里使用的好处。毕竟这让我可以使用状态 Monad 编写相当干净的代码:

 reverseEdgesM :: State Graph ()
 reverseEdgesM = do --...

然后每当我有一些纯代码可以使用runState和朋友运行时弹出它:

 reverseEdges :: Graph -> Graph
 reverseEdges = execState reverseEdgesM

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

此外,如果您刚刚要实现一些算法,您可能想要查看现有的功能图形数据结构库(如fgl),而不是自己动手。如果您想了解该理论,请查看Erwig 关于归纳图的论文

于 2012-02-06T03:53:03.507 回答