Erlang中的变量

时间:2014-03-22 19:57:13

标签: erlang

如果我没有错,那么erlang变量只能绑定一次。

像:

C = cat.

但以此为例:

1> FallVelocity = fun(Distance) -> math:sqrt(2 * 9.8 * Distance) end.
#Fun<erl_eval.6.111823515>

我能做到:

3> FallVelocity(20).
19.79898987322333
4> FallVelocity(200).
62.609903369994115
5> FallVelocity(2000).
197.9898987322333

为什么在程序过程中多次调用函数。这是不是意味着同一个变量会被绑定多次?

3 个答案:

答案 0 :(得分:4)

在Simon St. Laurent的“介绍Erlang”一书中,有一个特殊部分可以解释您的问题:

  

功能和可变范围

     

Erlang只允许您绑定一次变量,但您可以调用一个变量   在程序过程中多次运行。这不意味着什么   相同的变量会被绑定多次?是的,它将受到许多限制   时间,但总是在不同的背景下。 Erlang不考虑   多次调用同一个函数是一回事。开始   每次调用时都有一组未分配的变量   功能

     

同样,如果您使用相同的变量名,Erlang也不担心   不同的功能或功能条款。他们不会   同时在相同的上下文中调用,所以没有   碰撞。

     

您需要避免将值重新分配给已绑定的位置   变量在给定函数的给定路径内。只要   你不应该尝试在给定的上下文中重用变量   不得不担心。

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

答案 1 :(得分:2)

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

每次调用 FallVelocity 的结果都不会分配给 FallVelocity var。 FallVelocity 的目的是引用一个函数,而不是调用该函数的结果。

无法做>的内容如下:

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

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

第4行将失败,因为 Hoohaa 变量已经被限制为19.79898987322333(感谢Erlang中的模式匹配)。

答案 2 :(得分:1)

不是说每个变量只绑定一次,而是更精确地说每个变量的每个实例只绑定一次。每次调用FallVelocity函数时,都会创建Distance变量的实例,并且此实例绑定到作为FallVelocity调用中的参数传递的值。

在Erlang中,变量的给定实例在创建时接收一个值,之后没有为其赋值的概念。

大多数其他语言具有相同的变量实例概念。当您使用命令式语言调用函数时,这将创建其局部变量的新实例,并且当函数返回时这些实例将消失。 Erlang(和其他函数式语言)和命令式语言之间的区别在于Erlang中的变量实例指定了一个值,而命令式语言中的变量实例指定了一个存储位置,该存储位置本身包含一个可以转换的值。时间。

对于FallVelocity,只有一个实例。 FallVelocity的值是一个函数(它不是函数的结果;函数返回的值,即函数的结果,在代码片段中没有给出名称)。如果多次调用此函数,则每次都会执行函数的代码 - 它仍然与执行的函数相同。