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。結局のところ、状態モナドを使用してかなりクリーンなコードを書くことができます。

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

runState次に、友人を使用して実行する純粋なコードがある場合はいつでも、それをポップアウトします。

 reverseEdges :: Graph -> Graph
 reverseEdges = execState reverseEdgesM

関数のアイデアを推し進めたい場合は、差分リストを調べて、単純なリストでどのように行われるかを確認することをお勧めします。

また、実装するアルゴリズムがいくつかある場合は、独自のアルゴリズムを作成するのではなく、既存の機能グラフデータ構造ライブラリ(fglなど)を調べることをお勧めします。理論を理解したい場合は、帰納的グラフに関するErwigの論文をチェックしてください。

于 2012-02-06T03:53:03.507 に答える