Erlang中的变量

Erlang中的变量,erlang,Erlang,如果我没有错的话,在erlang中,变量只能绑定一次 比如: 但以此为例: 1> FallVelocity = fun(Distance) -> math:sqrt(2 * 9.8 * Distance) end. #Fun<erl_eval.6.111823515> 为什么在程序过程中多次调用函数。这不意味着同一个变量将被绑定多次吗?FallVelocity指的是一个函数。然后使用不同的参数调用FallVelocity几次。当然,每次调用FallVelocity都会产

如果我没有错的话,在erlang中,变量只能绑定一次

比如:

但以此为例:

1> FallVelocity = fun(Distance) -> math:sqrt(2 * 9.8 * Distance) end.
#Fun<erl_eval.6.111823515>
为什么在程序过程中多次调用函数。这不意味着同一个变量将被绑定多次吗?

FallVelocity指的是一个函数。然后使用不同的参数调用FallVelocity几次。当然,每次调用FallVelocity都会产生不同的结果

FallVelocity每次调用的结果都不会指定给FallVelocity变量。FallVelocity的目的是引用函数,而不是引用该函数调用的结果

以下是您不能做的事情:

3> Hoohaa = FallVelocity(20). %% This is ok
   19.79898987322333

4> Hoohaa = FallVelocity(200). %% Nope, it will fail

第4行将失败,因为由于Erlang中的模式匹配,Hoohaa变量已经绑定到19.798987322333。

与其说每个变量只绑定一次,不如说每个变量实例只绑定一次更精确。每次调用FallVelocity函数时,都会创建距离变量的实例,并且该实例将绑定到调用FallVelocity时作为参数传递的值

在Erlang中,变量的给定实例在创建时接收一个值,并且没有在创建后为其分配不同值的概念

大多数其他语言都有相同的变量实例概念。在命令式语言中调用函数时,会创建其局部变量的新实例,并且这些实例会在函数返回时消失。Erlang与其他函数式语言和命令式语言的区别在于,Erlang中变量的实例指定一个值,而命令式语言中变量的实例指定一个存储位置,存储位置本身包含一个随时间变化的值

至于FallVelocity,只有一个例子。下降速度的值是一个函数,它不是函数的结果;函数返回的值,即函数的结果,在代码段中没有给出名称。如果多次调用此函数,则每次都会执行该函数的代码,并且它仍然是执行的同一个函数。

在Simon St.Laurent的《介绍Erlang》一书中,有一个专门的章节谈到了您的问题:

函数和变量范围

Erlang只允许绑定变量一次,但可以调用 在程序运行过程中多次运行。那不是意味着 同一个变量将绑定多次?是的,它将被绑定很多 但总是在不同的上下文中。二郎不考虑 对同一函数的多个调用是同一件事。开始了 每次调用时都会有一组新的未赋值变量 功能

类似地,如果在中使用相同的变量名,Erlang也不会担心 不同的函数或函数子句。他们不会的 在同一时间在同一上下文中调用,因此没有 碰撞

需要避免将值重新指定给已绑定的对象的位置 变量位于通过给定函数的给定路径内。只要 您不应该在给定的上下文中尝试重用变量,您不应该这样做 我不得不担心


-介绍Erlang,第2章-函数和模块,第18页

我不太清楚你的意思。在您的示例中,哪个变量被多次绑定?函数参数?@miushock我的意思是FallVelocity,它返回不同的值。然后Chiron完美地回答了这个问题。请注意,不仅仅是变量,函数文本也需要名称。本例中的FallVelocity表示一些要执行的代码,这些代码保持不变。@miushock感谢您添加更多信息!二郎对我来说有点不同!:我有一种感觉,OP可能意味着参数距离被绑定到每个调用的不同值。@miushock最初的意图不清楚,但我认为他/她认为,由于最后一行有趣的事情是返回一个值,该值将被分配给FallVelocity变量。这也是我感到不明确的地方。OP可能需要知道函数编程的一个概念是不改变每个函数调用中的程序状态
3> FallVelocity(20).
19.79898987322333
4> FallVelocity(200).
62.609903369994115
5> FallVelocity(2000).
197.9898987322333
3> Hoohaa = FallVelocity(20). %% This is ok
   19.79898987322333

4> Hoohaa = FallVelocity(200). %% Nope, it will fail