Erlang 将有向图保存到记忆中会因为其副作用而受阻

Erlang 将有向图保存到记忆中会因为其副作用而受阻,erlang,Erlang,已更新 erlang中的有向图库实现了一种副作用的数据类型。数据类型上的每个操作都将其新状态保存在ets表中,而不是返回其自身的修改版本,这在函数式语言中更为常见 从使用的角度来看,问题在于它妨碍了我以方便的方式存储或传递状态,因为它要求我在开始处理状态之前先“收集”状态 到目前为止,我所看到的最接近的解决方案是a,但它们有一个缺点,即它们与有向图的当前结构相关联,而不是对抽象类型进行操作——这妨碍了未来的解决方案 更新 Pascal指出了另一个利用有向图接口的序列化程序,从而消除了上述缺点。这

已更新

erlang中的有向图库实现了一种副作用的数据类型。数据类型上的每个操作都将其新状态保存在ets表中,而不是返回其自身的修改版本,这在函数式语言中更为常见

从使用的角度来看,问题在于它妨碍了我以方便的方式存储或传递状态,因为它要求我在开始处理状态之前先“收集”状态

到目前为止,我所看到的最接近的解决方案是a,但它们有一个缺点,即它们与有向图的当前结构相关联,而不是对抽象类型进行操作——这妨碍了未来的解决方案

更新

Pascal指出了另一个利用有向图接口的序列化程序,从而消除了上述缺点。这显然要好得多,尽管仍然不方便,但我认为没有更好的选择


您对如何存储有向图有何建议?我应该使用不同的数据类型吗


谢谢。

我不太明白你的担心。有向图存储在ETS中这一事实在用户界面中是透明的,因此您可能希望对此进行更改,以便与另一个进程交换有向图、制作副本或在崩溃时拥有永久存储

对于前两个主题,很容易检索元组中有向图的定义
{Cyclic,Protect,[Vertice],[edge]}
,然后交换它:

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.
有向图到元组(Di)->
Opt=有向图:信息(Di),

Vs=[digraph:vertex(Di,X)| | X我不确定是否理解您的担忧。有向图存储在ETS中的事实在用户界面中是透明的,因此您可能希望将其更改为与另一个进程交换有向图、制作副本或在崩溃时拥有永久存储

对于前两个主题,很容易检索元组中有向图的定义
{Cyclic,Protect,[Vertice],[edge]}
,然后交换它:

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.
有向图到元组(Di)->
Opt=有向图:信息(Di),
Vs=[digraph:vertex(Di,X)| | X您还可以使用Erlang(集合集)模块获得完整的不可变数据结构,其中包含以后重建相同图形所需的所有数据

克隆(有向图)->
族=sofs:有向图到族(有向图),
sofs:族到有向图(族)。
您还可以使用Erlang(集合集)模块获得完整的不可变数据结构,其中包含以后重建相同图形所需的所有数据

克隆(有向图)->
族=sofs:有向图到族(有向图),
sofs:族到有向图(族)。

谢谢你的回答,我更新了一点问题以更好地表达我的担忧。谢谢你的回答,我更新了一点问题以更好地表达我的担忧。