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}
这是有道理的。 它看起来像比较两个函数的抽象语法树。
但在本次会议中, X
和Y
再次被定义为相同,但是不同,现在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 或任何独特的参考。 也许它是比较引用,只是一些优化正在发生, X
和Y
被绑定到相同的引用? 如果对此有一些解释,那么在不同的虚拟机或不同的节点上会发生什么?
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