如果我没有错,那么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
为什么在程序过程中多次调用函数。这是不是意味着同一个变量会被绑定多次?
答案 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
的值是一个函数(它不是函数的结果;函数返回的值,即函数的结果,在代码片段中没有给出名称)。如果多次调用此函数,则每次都会执行函数的代码 - 它仍然与执行的函数相同。