在Erlang中重写变量

在Erlang中重写变量,erlang,Erlang,我在玩唱片和单子。拜托,我想知道如何使用一个变量两次。当我将任何值赋给变量_list之后,我尝试重写此变量,然后引发错误: **异常错误:右侧值不匹配 但当我两次使用变量列表时,会出现错误: do_it_hard()-> empty_list(), _list = add_person(any_data(), #person{name = "Test",phone = "+421Test", addresa = "Testova 20 81101 Testovo", rc =881

我在玩唱片和单子。拜托,我想知道如何使用一个变量两次。当我将任何值赋给变量_list之后,我尝试重写此变量,然后引发错误:

**异常错误:右侧值不匹配

但当我两次使用变量列表时,会出现错误:

do_it_hard()->
  empty_list(),
  _list = add_person(any_data(), #person{name = "Test",phone = "+421Test", addresa = "Testova 20 81101 Testovo", rc =88113545}),
  _list =add_person(_list, #person{name = "Test2",phone = "+421Test2", addresa = "Testova 20 81101 Testovo2", rc =991135455}),
  get_persons(_list)
.
我用谷歌

Erlang是一种单一的赋值语言。也就是说,一旦给了变量一个值,就不能给它另一个值。从这个意义上讲,它就像代数,而不像大多数传统的编程语言


在REPL中,可以方便地在重复使用变量名的同时进行实验。在那里,您可以执行
f(A)。
让Erlang“忘记”当前
A的赋值

1> Result = connect("goooogle.com").
{error, "server not found"}
2> % oops! I misspelled the server name
2> f(Result).
ok
3> Result = connect("google.com").
{ok, <<"contents of the page">>}
这不是很地道的Erlang;我试图让它与上面的程序代码相一致

正如你所看到的,我得到了同样的效果,但是我在函数中的赋值是固定的


作为旁注,您使用了许多以下划线开头的变量名。在Erlang中,这是一种暗示您将不会使用这些变量的值的方法。(就像在上面的例子中,当我到达列表的末尾时,我不关心服务器列表。)在代码中使用前导下划线会关闭一些有用的编译器警告,并会混淆查看代码的任何其他开发人员。

在某些情况下,可以方便地使用:

SeqBind是一种解析转换,它自动对后缀@(创建L@0, L@1, Req@0, Req@1)等等

简单的例子:

...
-compile({parse_transform,seqbind}).
...

List@ = lists:seq(0, 100),
List@ = lists:filter(fun (X) -> X rem 2 == 0 end, List@)
...
for (int i = 0; i < max; i++) {
  conn = connect(servers[i]);
  reply = send_data(conn);
  print(reply);
}
send_all(Max, Servers) ->
 send_loop(1, Max, Servers).

send_loop(Current, Max, _Servers) when Current =:= Max->
 ok;
send_loop(Current, Max, Servers) ->
 Conn = connect(lists:nth(Current, Servers)),
 Reply = send_data(Conn),
 print(Reply).
...
-compile({parse_transform,seqbind}).
...

List@ = lists:seq(0, 100),
List@ = lists:filter(fun (X) -> X rem 2 == 0 end, List@)
...