erlang中的函数相等/排序

将Erlang中的函数与运算符=:===<>=<>=进行比较意味着什么? 我和翻译一起玩,并得到了这些结果:

Eshell V5.9.2  (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
3> 
3> {X == X, X =:= X}.
{true,true}
4> {X >= X, X =< X}.
{true,true}
5> {X > X, X < X}.
{false,false}
6> 
6> {X == Y, X =:= Y}.
{true,true}
7> {X >= Y, X =< Y}.
{true,true}
8> {X > Y, X < Y}.
{false,false}

这是有道理的。 它看起来像比较两个函数的抽象语法树。

但在本次会议中, XY再次被定义为相同,但是不同,现在X<Y

Eshell V5.9.2  (abort with ^G)
1> X = fun() -> {} end.
#Fun<erl_eval.20.82930912>
2> 
2> {X == X, X =:= X}.
{true,true}
3> {X >= X, X =< X}.
{true,true}
4> {X > X, X < X}.
{false,false}
5> 
5> Y = fun() -> {} end.
#Fun<erl_eval.20.82930912>
6> 
6> {X == Y, X =:= Y}.
{false,false}
7> {X >= Y, X =< Y}.
{false,true}
8> {X > Y, X < Y}.
{false,true}

所以它看起来不是比较AST 任何独特的参考。 也许它是比较引用,只是一些优化正在发生, XY被绑定到相同的引用? 如果对此有一些解释,那么在不同的虚拟机或不同的节点上会发生什么?


shell中的2个评估之间的差异来自空行6>。 如果您使用函数erlang:fun_info / 1查看乐趣,您将看到在这种情况下,该子句以不同的数字(即2而不是1)存储。

如果再次输入Y的定义(没有空白行),你会得到一个错误的匹配,如果你之前输入一个空白行,这是正确的。

我认为这是使用shell的副作用,但是在程序中行为是一致的。 当然,“或”的含义对于一种乐趣并不明显,但==是的。 一个好的方面是Erlang术语的顺序已经定义,所以可以用可预测的行为对任何术语的列表进行排序:

number < atom < reference < fun < port < pid < tuple < list < bit string
链接地址: http://www.djcxy.com/p/11355.html

上一篇: Function equality/ordering in erlang

下一篇: How to use Ninject across assemblies