Erlang /变量赋值

时间:2014-07-18 05:38:01

标签: erlang

我调查了Erlang并且对变量的重新分配感到困惑,例如可以使用计数器:

环(值,计数器) - >  IO:格式( “〜S,〜n的”,[值]),  环(值,的计数器-1 )。

我希望看到纯粹的功能性语言。 或者,我应该改变我的POV吗?

干杯,

托马斯

2 个答案:

答案 0 :(得分:4)

  1. 您的示例中没有重新分配 - Counter-1是一个新值,未分配给任何现有变量。
  2. Erlang不是纯粹的功能语言。

答案 1 :(得分:2)

loop(Value,Counter)-> io:format("~s,~n",[Value]), loop(Value,Counter-1).

在上面的函数定义中,函数名称本身出现在定义的右侧,并且与同一个arity一起使用。我们将这种类型的定义称为递归定义。每个递归调用将定义一个名为Counter的值,该值仅在当前递归级别中可见。换句话说,对应于表达式Counter - 1的评估的数字将绑定到 new Counter变量,与表达式中使用的变量无关。

但是,这种类型的递归函数调用称为 tail-recursive 。它是一种特定类型的调用,具有可优化到实际循环的属性。最终结果是函数使用的Counter的内存单元将使用新值更新并在递归调用中使用,而不是再次为新的Counter分配(1) )。这允许潜在的无限递归方案。


关于功能语言的概念,如果不首先对构成功能语言的内容进行适当的定义,以及纯粹的功能语言是什么,就很难回答。

在我的书中,函数式语言是一种基于lambda演算概念的语言:函数抽象和应用程序,高阶函数:这也称为函数作为语言的一等公民。 Erlang绝对适合这种模式。纯FL可能是不支持其他主要编程范式的,即命令式(变量可变性)。 再次Erlang匹配那个定义。如果你有不同的定义,那么Erlang的情况可能会有所不同。

Pascal在评论部分指出,Erlang中有一个不遵循纯函数式语言范式的工具: Process dictionaries。实际上,可以在该结构中设置值,并且如上所述:

  

请注意使用Process Dictionary:

     
      
  • 破坏参照透明度

  •   
  • 使调试变得困难

  •   
  • Survives Catch / Throw

  •   

(强调我的)。

因此,Erlang并非严格纯粹。


(1)尾递归不是实现优化的唯一方法:参见http://learnyousomeerlang.com/recursion