小编jvf*_*jvf的帖子

在Erlang中测试集合的相等性

给定集合的数据结构,测试两个集合是否相等似乎是一项理想的任务,并且实际上许多实现都允许这样做(例如python中的内置集合)。

有不同的设置实现了二郎:setsordsetsgb_sets。他们的文档没有指出是否可以使用术语比较(“ ==”)来测试相等性,也没有提供用于测试相等性的显式功能。

某些幼稚的情况似乎允许使用“ ==”进行相等性测试,但是我有一个更大的应用程序可以在其中生成setsgb_sets相等(使用下面的函数进行测试),但不将其与“ ==”进行比较。对于ordsets,它们总是比较相等。不幸的是,对于相等集不等于“ ==”的情况,我还没有找到产生最小示例的方法。

为了可靠地测试相等性,我基于以下关于集合相等性的定理使用以下函数:

%% @doc Compare two sets for equality.
-spec sets_equal(sets:set(), sets:set()) -> boolean().
sets_equal(Set1, Set2) ->
    sets:is_subset(Set1, Set2) andalso sets:is_subset(Set2, Set1).
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 他们的理由是,为什么Erlang set实现不提供显式的相等性测试?
  2. 当为不同的集合实现使用“ ==”测试集合相等性时,如何解释差异?
  3. sets在给出上述代码的情况下,如何生成一个最小示例,其中“ ==”不等于,但集合相等?

对问题2的一些思考:

有关sets状态的文档,“未定义集合的表示形式”。其中,作为ordsets状态的文档,“一个ordset是一个集合的表示”。上的文档gb_sets未提供任何可比的指示。下面的评论,从该源代码sets实现,似乎重申从文档的声明:

请注意,由于键的顺序未定义,我们可以在存储桶中自由地对键进行重新排序。

我的解释是,在Erlang中用“ ==”进行的术语比较适用于集合的表示,即两个集合仅在表示相同时比较相等。这将解释不同集合实现的不同行为,但也将进一步说明为什么没有显式的相等比较的问题。

erlang functional-programming set

3
推荐指数
1
解决办法
607
查看次数

在Erlang中显示特定于连接的cookie

在具有erlang:set_cookie/2它的节点上设置cookie时,可以为不同的节点设置不同的cookie.有没有办法显示哪个cookie为哪个节点设置?

调用erlang:get_cookie/1不显示此信息,仅显示"默认"cookie.

例:

使用cookie启动NodeA,使用带有cookie foo的NodeB 启动bar.在NodeA上现在设置与基站通信时使用的cookie bar调用erlang:set_cookie(NodeB, bar).Ping现在工作正常,没有"连接尝试不允许的节点..."错误.erlang:get_cookie()然而,调用NodeA仍会显示"默认"cookie foo.如何找到为NodeB设置的cookie?

erlang

3
推荐指数
1
解决办法
75
查看次数

半成熟的TCP连接

半成熟的连接

使用半连接的连接,我的意思是客户端的调用connect()成功返回的连接,但服务器调用accept()没有.这可以通过以下方式发生:客户端调用connect(),从而生成SYN到服务器的数据包.服务器进入状态SYN-RECEIVED并向SYN-ACK客户端发送数据包.这会导致客户端回复ACK,进入状态ESTABLISHED并从connect()呼叫返回.如果最终ACK丢失(或忽略,由于在服务器上,这可能是更可能的情况全接受队列),服务器仍处于状态SYN-RECEIVEDaccept()不返回.由于与SYN-RECEIVED状态相关的超时SYN-ACK将重新发送,允许客户端重新发送ACK.如果服务器能够ACK最终处理,它也将进入状态ESTABLISHED.否则它最终将重置连接(即发送RST到客户端).

您可以通过在单个侦听套接字上启动大量连接来创建此方案(如果不调整积压工作tcp_max_syn_backlog).有关更多详细信息,请参阅此问题本文.

实验

我进行了几次实验(使用此代码的变体)并观察了一些我无法解释的行为.所有使用Erlang gen_tcp和当前Linux 执行的实验,但我强烈怀疑答案并非特定于此设置,所以我试图在这里保持更一般.

connect()- >等 - > send()- >receive()

我的出发点是从客户端建立连接,等待1到5秒,向服务器发送"Ping"消息并等待回复.通过这种设置,我观察到当我有一个半连接时receive()失败并出现错误closed.在send()半连接的连接期间从未出现过错误.您可以在此处找到有关此设置的更详细说明.

connect() - >漫长的等待 - > send()

要看,如果我在半连接的连接上发送数据时可能会出错,我会在发送数据前等待4分钟.4分钟应涵盖与半连接相关的所有超时和重试.仍然可以发送数据,即send() …

sockets erlang network-programming tcp gen-tcp

3
推荐指数
1
解决办法
871
查看次数

什么是需要is_subtype的最后一个Erlang版本

根据Erlang类型和函数规范,约束约束中函数的输出类型::可以when-spec属性的一部分中使用:

-spec id(X) -> X when X :: tuple().
Run Code Online (Sandbox Code Playgroud)

为了向后兼容,还可以使用:

-spec id(X) -> X when is_subtype(X, tuple()).
Run Code Online (Sandbox Code Playgroud)

但不鼓励使用is_subtype(不建议使用).什么是最后一个需要使用is_subtype而不是::?的Erlang版本?

erlang

0
推荐指数
1
解决办法
52
查看次数