1

更新しました

erlang の digraph ライブラリは、副作用のあるデータ型を実装しています。データ型の各操作は、関数型言語でより一般的な変更されたバージョン自体を返すのではなく、新しい状態を ets テーブルに保存します。

使用上の観点からの問題は、状態を操作し始める前にまず状態を「収集」する必要があるため、状態を便利な方法で保存したり渡したりする私の努力を妨げることです。

私がこれまで見てきた最も近い解決策はserializer/deserializerですが、これらには、抽象型で操作するのではなく、ダイグラフの現在の構造に結び付けられているという欠点があります。これにより、将来の証明ソリューションが妨げられます。

アップデート

Pascal は、digraph のインターフェースを利用する別のシリアライザーを指摘し、それによって上記の欠点を解消しました。まだ不便ではありますが、明らかにはるかに優れていますが、これ以上の代替手段はありません.


有向グラフの保存方法に関する推奨事項は何ですか? 別のデータ型を使用する必要がありますか?

ありがとう。

4

2 に答える 2

3

Erlang のsofs (セットのセット) モジュールを使用して、後で同一のグラフを再構築するために必要なすべてのデータを含む完全な不変データ構造を取得することもできます。

clone(Digraph) ->
  Family = sofs:digraph_to_family(Digraph),
  sofs:family_to_digraph(Family).
于 2016-08-11T11:51:11.710 に答える
2

あなたの懸念がよくわかりません。有向グラフが ETS に保存されているという事実は、ユーザー インターフェイスでは透過的であるため、これを変更して、別のプロセスと有向グラフを交換したり、コピーを作成したり、クラッシュの場合に永続的なストレージを用意したりすることができます。

{Cyclic,Protect,[Vertice],[edge]}最初の 2 つのトピックでは、タプルで有向グラフの定義を取得して交換するのは非常に簡単です。

digraph_To_Tuple(Di) ->
    Opt = digraph:info(Di),
    Vs = [digraph:vertex(Di,X) || X <- digraph:vertices(Di)],
    Es = [digraph:edge(Di,X) || X <- digraph:edges(Di)],
    {proplists:get_value(cyclicity,Opt),proplists:get_value(protection,Opt),Vs,Es}.

clone (Di) -> 
    {Cyclic,Protect,Vs,Es} = digraph_To_Tuple(Di),                                                                        
    Do = digraph:new([Cyclic,Protect]),                                                                            
    [digraph:add_vertex(Do,V,N) || {V,N} <- Vs ],  
    [digraph:add_edge(Do,E,S,D,N) || {E,S,D,N} <- Es], 
    Do.

最後のトピックは、ets を作成したプロセスが終了するとすぐに ets が破棄されるため、実際の問題です。所有権を他のプロセスに譲渡する手段はいくつかありますが、この場合、ets の実装との独立性が失われます。より良い可能性は、プロセスで有向グラフを作成し、それを担当する他のプロセスに渡して操作することです。

しかし、モジュールの一部または全体を書き直さない限り、別のタイプのストレージを用意する意味はないと思います。

于 2013-09-25T12:41:51.883 に答える