鉴于两个相同的元组,我如何按字典顺序比较它们?看起来这应该像下面的代码片段一样简单,但事实并非如此.任何简单的例子如何做到这一点?
var x = (1,2,3) < (1,2,4)
Run Code Online (Sandbox Code Playgroud)
如果他们列出,我可以定义一个递归函数,比较列表的头部直到找到差异或列表的结尾,但我不认为我可以为元组做到这一点.
我想在Erlang中翻译TLA中指定的一些操作.你能想到在Erlang或任何可用的框架中直接这样做的自然方式吗?简而言之(一个非常小的一个),TLA动作是变量的条件,其中一些是引导的,这意味着它们代表了下一个状态中变量的值.例如:
Action(x,y,z) ->
and PredicateA(x),
and or PredicateB(y)
or PredicateC(z)
and x' = x+1
Run Code Online (Sandbox Code Playgroud)
此动作是指,每当系统的状态是这样的,PredicateA
对于变量为真x
,要么PredicateB
为真y
或PredicateC
为真对z
,则系统可以改变它的状态,以便确保所有内容均不同之处在于同一x
改变为当前值加1 .
表达在Erlang中需要大量的管道,至少在我发现的方式.例如,通过在触发条件之前使用循环来评估条件,例如:
what_to_do(State,NewInfo) ->
PA = IsPredicateA(State,NewInfo),
PB = IsPredicateB(State,NewInfo),
PC = IsPredicateC(State,NewInfo),
[{can_do_Action1, PA and (PB or PC}, %this is the action specified above.
{can_do_Action2, PA and PC}, %this is some other action
{can_do_Action3, true}] %this is some action that may be executed at any time. …
Run Code Online (Sandbox Code Playgroud) 我正在尝试定义记录#a和记录#b,以便#b扩展#a,这样我就可以在某些情况下将#b(以及#a的其他子类型)视为#a.但是编译器并不喜欢它,并且一直试图根据我对它的第一次访问来猜测记录类型.以下代码触发警告.
-module(sandbox).
-record(a,{alfa,beta}).
-record(b,{alfa,beta,gama}).
-export([test/0]).
test() ->
A = #b{alfa=1,beta = 2,gama=3},
self()!{msg,A},
receive
{msg,Msg} ->
Alfa = Msg#b.alfa,
Beta = Msg#b.beta,
case is_record(Msg,b) of
true ->
Gama = Msg#b.gama;
false-> %% Warning. Erlang assumes that Msg is a #b and therefore this will never match.
Gama = []
end
end,
io:format("~p ~p ~p",[Alfa,Beta,Gama]).
test1() ->
A = #b{alfa=1,beta = 2,gama=3},
self()!{msg,A},
receive
{msg,Msg} ->
Alfa = Msg#a.alfa,
Beta = Msg#a.beta,
case is_record(Msg,b) of
true -> %% Warning. Erlang assumes …
Run Code Online (Sandbox Code Playgroud)